这个问题在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
时,我的输出与输入相同。
请帮助我或建议我新的东西以获得所需的输出。
答案 0 :(得分:2)
我没有给你完整的工作计划,而是更愿意引导你走向正确的方向。
首先,c+1
并不意味着“输入中的下一个字符”。它只会将1
添加到c
的值,从而有效地将c
转换为ASCII table中的下一个字符。
例如,如果c
是'a'
,c+1
表示'b'
,它是ASCII table中的下一个字符,如果c
是{{1}表格中代码为32的(单个空格),' '
为c+1
,表格中包含代码33。
嗯,要获得下一个角色,你需要阅读它!以同样的方式阅读第一个字符。实现此目的的最佳方法是始终保持先前读取的字符,并使用当前读取的字符进行检查。
因此,您需要两个变量,例如'!'
和c
。您阅读该角色并将其存储在pc
中。首先,c
是pc
。如果读取的字符不是空格或制表符,则将其写入输出。如果是制表符,则将其更改为空格。如果是空格,则检查前一个字符('\0'
)。如果不是空格,请打印pc
。在循环结束时,您应该将c
的值存储到c
,这意味着您将pc
中的前一个字符保留。
我想我告诉了你完整的解决方案!
答案 1 :(得分:1)
问题是:您要检查NEXT字符,但检查当前字符的值增加1。
答案 2 :(得分:1)
方法略有错误,这是一个提示,将最后一个字符保留为状态,如果新输入的字符是空格而最后一个字符是空格,则不输出,只需绕回循环并等待下一个字符。
如果当前字符不是空格,则输出并更新状态 ...