这个问题在K&R ,练习 1.9。我写了下面的代码:
#include<stdio.h>
main()
{
int c,i=0,n=0;
while((c=getchar())!=EOF)
{
if(c!=' '||c!='\t')
{
i=0;
putchar(c);
}
else if(c==' '||c=='\t')
{
i++
}
if((c+1)!=' '||(c+1)!='\t')
n=i;
if(n!=0)
{
c=' ';
putchar(c);
}
}
}
但我无法获得所需的输出。我在 ubuntu 中使用 gcc。当我输入类似 hello\t\ta
的内容时,我的输出是 hello\_\_a
即制表符数被空格数替换,当我输入 hello\_\_a
然后我的输出与输入相同。
请帮助我或建议我一些新的东西以获得所需的输出。
最佳答案
与其给你完整的工作计划,我更愿意引导你走向正确的方向。
首先,c+1
并不表示“输入中的下一个字符”。它只是将 1
添加到 c
的值,这有效地将 c
转换为 ASCII table 中的下一个字符。 .
比如c
是'a'
,c+1
就是'b'
,也就是下一个字符int ASCII table , 如果 c
是表中代码为 32 的 ' '
(单个空格),则 c+1
是 '!'
在表中有一个代码 33。
好吧,要获得下一个角色,您需要阅读它!以同样的方式阅读第一个字符。实现此目的的最佳方法是始终保留先前读取的字符,并与当前读取的字符进行核对。
因此您需要两个变量,例如c
和pc
。您读取字符并将其存储在 c
中。起初,pc
是'\0'
。如果读取的字符不是空格或制表符,则将其写入输出。如果它是制表符,则将其更改为空格。如果是空格,则检查前一个字符 (pc
)。如果不是空格,打印c
。在循环结束时,您应该将 c
的值存储到 pc
中,这意味着您保存了 pc
中的前一个字符。
我想我已经告诉您完整的解决方案了!
关于替换所有制表符的代码,如果一个空格超过 1 个空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14998537/