1

这个问题在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我的输出与输入相同。

请帮助我或建议我一些新的东西以获得所需的输出。

4

3 回答 3

2

与其给你完整的工作计划,我更愿意引导你走向正确的方向。

首先,c+1并不意味着“输入中的下一个字符”。它只会增加1的值c,从而有效地转换为ASCII 表c中的下一个字符。例如 if is ,表示,它是ASCII 表中的下一个字符,并且 if is (单个空格)在表中具有代码 32,在表中具有代码 33。c'a'c+1'b'c' 'c+1'!'

好吧,要获得下一个角色,您需要阅读它!以同样的方式阅读第一个字符。实现这一点的最佳方法是始终保持先前读取的字符,并与当前读取的字符进行检查。

因此,您需要两个变量,例如cpc。您读取字符并将其存储在c. 起初,pc'\0'。如果读取的字符不是空格或制表符,则将其写入输出。如果是制表符,则将其更改为空格。如果是空格,则检查前一个字符 ( pc)。如果不是空格,请打印c. 在循环结束时,您应该存储cinto的值pc,这意味着您将前一个字符保存在pc.

我想我告诉你完整的解决方案!

于 2013-02-21T10:47:30.997 回答
1

问题是:你想检查 NEXT 字符,但你检查当前字符的值加一。

于 2013-02-21T09:32:06.460 回答
1

做法稍有错误,这里提示一下,保持最后一个字符为state,如果新输入的字符是空格,最后一个字符是空格,则不输出,直接返回循环等待下一个字符。

如果当前字符不是空格,则输出并更新状态...

于 2013-02-21T10:34:12.110 回答