首页 > 解决方案 > C 编程语言,比较练习 1-9 和 1-12 的解决方案时的困惑

问题描述

作为一名编程新手,我一直在尝试自学 C,以便使用 C 编程语言(第 2 版)更好地理解计算机。

到目前为止,该站点在解决问题方面非常有帮助,但是有一个问题我无法解决。这是我提出的练习 1-12 的解决方案,使用我对 1-9 的解决方案作为背景。我想知道这个在线社区中是否有人会指出我哪里出错了。

练习 1-9 要求你“编写一个程序将其输入复制到其输出,用一个空格替换多个空格中的每个字符串

有很多方法可以在这里给众所周知的猫剥皮,但对我来说最简单的解决方案是:

int c;

while((c = getchar()) != EOF)
  {
   if(c == ' ')
     {
        putchar(' ');
        while((c = getchar()) == ' ') // if there are subsequent blanks
        ; // do nothing
     }

   if(c != EOF)
    putchar(c);
  }

现在练习 1-12 要求你“编写一个程序,每行打印一个单词。

我的第一次尝试是成功的,但问题过于简单化了。

int c;

while((c = getchar()) != EOF)
{  if(c == ' ')
     putchar('\n');

else
  putchar(c);
}

所以我试图纠正这一点以接受更广泛的输入,这是结果

int c;

while((c = getchar()) != EOF)
 {
    if(c == ' ' || c == '\t' || c == '\n')
     {
      putchar('\n');
      while((c = getchar()) == ' ' || (c = getchar()) == '\t' || (c = getchar()) == '\n')
      ;
     }

    if(c != EOF)
     putchar(c);
 }

现在我知道当我运行它时这是错误的,并且我在网上查找了其他非常简单的方法来解决问题。

我的问题是我不明白为什么它不起作用。对我来说,如果 1-9 的解决方案有效,我不明白为什么当我将相同的原则应用于 1-12 时它会失败。任何能指出这一点的人将不胜感激!

标签: c

解决方案


您所做的几乎是正确的,但每次调用都会getchar() 消耗一个输入字符。

你可以写

while ((c = getchar()) == ' ' || c == '\t' || c == '\n')

因为||运算符是从左到右处理的,中间有所谓的序列点;

虽然更清楚的是将初始化c移出循环条件。

最后,使用isspace它会消耗任何空白字符,输入更少:

#include <ctype.h>

int c;
do {
   c = getchar();
} while (isspace(c));

推荐阅读