我被要求写一个简单的程序来“格式化”基于众所周知的循环的文本:
int c;
while ((c = getchar()) != EOF)
putchar(c);
程序从stdin读取并写入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;
}
最佳答案
删除所有空行并将所有制表符和空格压缩为1个空格
你遇到的最大问题是如果你遇到一个' '
或者一个'\n'
你需要用一个较小的数字替换其中一个的多次出现,你需要继续阅读(在你的外部while
循环中的那一点),直到你找到一个不是' '
或者'\n'
的字符。这就简化了你的记录。(并且不需要spacecount
和newlinecount
)
由于您是针对多个字符进行测试,当您发现第一个字符与当前搜索字符不匹配时,只需将其放回stdin
中,然后移动到外部while循环的下一个迭代。
将所有tabs
和spaces
压缩为单个space
时,需要在单个tab
语句中测试space
或if
。
综合起来,你可以做到:
#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;
}
(注意:代码已更新以处理DOS/windoze
\r\n
行尾和Linux'\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>
过度使用/输出
使用相同的输入文件,输出现在是:
$ ./bin/gcfmt1 <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>
如果这是你想要的,请告诉我。
关于c - C-用空格替换制表符,用1个空格替换多个空格,用1个换行符替换多个换行符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37691588/