K& R - 练习1-9 - 删除空格

时间:2017-07-16 15:21:11

标签: c string while-loop

我最近开始使用K& R书(第2版)开始学习C,而我只是在思考这个解决方案时遇到麻烦,以便练习1-9,这是:

  

编写程序将其输入复制到其输出,替换每个字符串   一个空白的一个或多个空白。

我在网上找到了以下解决方案,除了putchar('');之上的分号外,它最有意义。如果没有它,程序就无法正常执行其功能,该分号有什么功能?

#include <stdio.h>

int main(void)
{
  int c;

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

提前致谢。

2 个答案:

答案 0 :(得分:17)

声明:

while((c = getchar()) == ' ')
;

缩进错误。它应该是:

while((c = getchar()) == ' ')
    ;

;是一个空语句,相当于空块{ }

这种孤独的;有点令人困惑,所以添加评论或其他重点来澄清其真实性质被认为是好的风格:

while ((c = getchar()) == ' ') {
    /* nothing */
}

while ((c = getchar()) == ' ')
    /* nothing */;

一些大胆的程序员写这个更令人困惑的形式(避免它):

while((c = getchar()) == ' ');

我个人更喜欢这种等效形式:

while ((c = getchar()) == ' ')
    continue;

答案 1 :(得分:12)

声明

  while((c = getchar()) == ' ')
  ;

被解析为

  while((c = getchar()) == ' ');

具有相同的效果
while((c = getchar()) == ' ') {
     /* Do nothing */
}

换句话说,它是一个身体无效的while循环。检查while循环条件的行为会读取字符并丢弃空格,这就是你想要做的事情。

如果删除分号,则while循环体最终成为循环后的语句,这会导致错误的语句重复。