我成功地复制了K&R 1.9的答案,
写一个程序把输入复制到输出,
将一个或多个空白的字符串替换为单个空白。
我遵循的代码如下:

#include <stdio.h>

int main(void)
{
int c;
int inspace;

    inspace = 0;
    while((c = getchar()) != EOF)
    {
        if(c == ' ')
        {
            if(inspace == 0)
            {
                inspace = 1;
                putchar(c);
            }
        }

        /* We haven't met 'else' yet, so we have to be a little clumsy */
        if(c != ' ')
        {
            inspace = 0;
            putchar(c);
        }
    }
    return 0;
}

我相信是因为
c=getchar()

在while循环中,每当代码完成if语句的后续操作时,程序将自动请求用户输入。
然而,为了测试我的理解,我想试着手动地
c=getchar()

在每个语句的末尾,它是必需的,而不是放在循环中,这样它就自动为我做了。这将类似于《K&R》的作者将其放在《K&R》第二版第16页。我相信这将测试我对整个代码中何时调用getchar()的理解。
下面是第16页的代码:
{
    int c;

    c=getchar();
    while (c !=EOF) {
        putchar(c);
        c=getchar();
     }
}

作者重申c=getchar(),而不是将其放入while循环中。
这是我修改过的代码,目的是在每个相关语句的末尾手动插入getchar();
#include <stdio.h>

main()

{
int a;
int b;

b=0;
a=getchar();

while(a!=EOF)
       {
        if(a==' ')
                {
                if(b==0)
                        {
                         putchar(a);
                         b=1;
                         a=getchar();
                         }
                if(b==1)
                         {
                         a=getchar();
                         }
                 }
       if(a!=' ')
              {
              putchar(a);
              b=0;
              a=getchar();
              }
      }
}

当我编译和运行文件时,结果如下;
如果我打字
hello

我收到
hello

如果我打字
hello  my  name

我收到
hello my name

(这是正确的结果;当一个语句中有多个空格时,空格的数目将减少到一个。)。请注意每个单词之间有两个空格)
但是,如果我键入:
hello my name

我收到
hello y ame

我的问题是:
为什么空格后面的字母会被我的代码截断?
(代码可能太长,因为我只使用了在K&R一书中学习到的语法1.9)

最佳答案

一般的问题是,当您应该使用if来处理其他情况时,您正在使用多个else语句。例如,您有:

            if(b==0)
            {
                 putchar(a);
                 b=1;
                 a=getchar();
            }
            if(b==1)
            {
                a=getchar();
            }

b0时,执行第一个块,然后执行第二个块,因为第一个块确实b = 1;。第二个块应该只是一个else,所以它只在第一个块不存在时执行。
同样的道理
if (a = ' ')


if (a != ' ')

因为您在第一个a块中重新分配if

关于c - 在K&R 1-9中手动循环复制getchar(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42170620/

10-14 02:43