我要求写一个简单的程序来格式化"基于众所周知的循环的文本:
int c;
while ((c = getchar()) != EOF)
putchar(c);
该程序从stdin& amp;写信给stdout&应使用I / O重定向进行测试。
输入中的每个标签都替换为空格&然后在输出中用一个空格替换两个或多个连续的空格。
输入中的两个或多个连续空行被输出中的一个空行替换。
注意:换行符是一行的最后一个字符,而不是下一行的第一个字符。
这是我到目前为止所拥有的内容,但我输入文本文件中的倍数空格,换行符和制表符未在输出文本文件中替换:
#include <stdio.h>
int main (void){
int c;
int spacecount = 0;
int newlinecount = 0;
while ((c = getchar()) != EOF){
if (c == '\n'){
if (++newlinecount < 3){
putchar(c);
}
continue;
}
newlinecount = 0;
if (c == ' '){
if (++spacecount < 2){
putchar(c);
}
continue;
}
spacecount = 0;
if (c == '\t'){
c = ' ';
}
putchar(c);
}
return 0;
}
答案 0 :(得分:2)
删除所有空行&amp;压缩所有选项卡&amp;空格到1个空格
你遇到的最大问题是,如果遇到' '
或'\n'
,你需要用较小的数字替换多次出现,你需要继续阅读(在你的外while
循环),直到找到不是' '
或'\n'
的字符。这简化了记录您的计数。 (并且无需spacecount
和newlinecount
)
由于您正在测试多个字符,当您发现第一个字符与当前搜索字符不匹配时,只需将其放回stdin
并移至外部while循环的下一次迭代。
将所有tabs
和spaces
压缩为单个space
时,您需要在单{{1}中测试tab
或space
声明。
将它们放在一起,你可以做到:
if
(注意:代码已更新为处理DOS / windoze #include <stdio.h>
int main (void) {
int c;
while ((c = getchar ()) != EOF)
{
if (c == '\r') continue;
if (c == '\n') { /* handle newlines/carriage-returns */
putchar (c);
while ((c = getchar ()) == '\n' || c == '\r') {}
if (c != EOF) ungetc (c, stdin); else break;
continue;
}
if (c == ' ' || c == '\t') { /* spaces & tabs */
putchar (' ');
while ((c = getchar ()) == ' ' || c == '\t') {}
if (c != EOF) ungetc (c, stdin); else break;
continue;
}
putchar (c);
}
return 0;
}
行结尾以及Linux \r\n
)
示例输入
'\n'
示例使用/输出
使用相同的输入文件,输出现在是:
$ cat dat/gcfmt.txt
N <tab> description
21 grapes
18 pickles
N <spaces> description
23 apples
51 banannas
<spaces>N<tab> description
8 cherries
4 mellons
6 strawberries
that's all folks <tab separated>
that's all folks <space separated>
如果这是你的意图,请告诉我。