C - 用空格替换制表符,用1个空格替换多个空格,用1换行替换多个换行符

时间:2016-06-08 00:38:57

标签: c

我要求写一个简单的程序来格式化"基于众所周知的循环的文本:

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;

}

1 个答案:

答案 0 :(得分:2)

删除所有空行&amp;压缩所有选项卡&amp;空格到1个空格

你遇到的最大问题是,如果遇到' ''\n',你需要用较小的数字替换多次出现,你需要继续阅读(在你的外while循环),直到找到不是' ''\n'的字符。这简化了记录您的计数。 (并且无需spacecountnewlinecount

由于您正在测试多个字符,当您发现第一个字符与当前搜索字符不匹配时,只需将其放回stdin并移至外部while循环的下一次迭代。

将所有tabsspaces压缩为单个space时,您需要在单{{1}中测试tabspace声明。

将它们放在一起,你可以做到:

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>

如果这是你的意图,请告诉我。

相关问题