代码替换所有选项卡,如果一个空格有多个空格?

时间:2013-02-21 09:22:40

标签: c

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

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

3 个答案:

答案 0 :(得分:2)

我没有给你完整的工作计划,而是更愿意引导你走向正确的方向。

首先,c+1并不意味着“输入中的下一个字符”。它只会将1添加到c的值,从而有效地将c转换为ASCII table中的下一个字符。 例如,如果c'a'c+1表示'b',它是ASCII table中的下一个字符,如果c是{{1}表格中代码为32的(单个空格),' 'c+1,表格中包含代码33。

嗯,要获得下一个角色,你需要阅读它!以同样的方式阅读第一个字符。实现此目的的最佳方法是始终保持先前读取的字符,并使用当前读取的字符进行检查。

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

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

答案 1 :(得分:1)

问题是:您要检查NEXT字符,但检查当前字符的值增加1。

答案 2 :(得分:1)

方法略有错误,这是一个提示,将最后一个字符保留为状态,如果新输入的字符是空格而最后一个字符是空格,则不输出,只需绕回循环并等待下一个字符。

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