gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:35:51 25 4
gpt4 key购买 nike

我被要求编写一个简单的程序来根据众所周知的循环“格式化”文本:

int c;
while ((c = getchar()) != EOF)
putchar(c);

程序从标准输入读取并写入标准输出,应该使用 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' .这简化了对计数的跟踪。 (并消除了对 spacecountnewlinecount 的需要)

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

压缩所有tabs时和 spaces到一个space ,您需要测试 tabspace在一个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 - 用空格替换制表符,用 1 个空格替换多个空格,用 1 个换行符替换多个换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37691588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com