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

sho*_*lly 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

chq*_*lie 17

该声明:

while((c = getchar()) == ' ')
;
Run Code Online (Sandbox Code Playgroud)

缩进不正确.它应该是:

while((c = getchar()) == ' ')
    ;
Run Code Online (Sandbox Code Playgroud)

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

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

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

while ((c = getchar()) == ' ')
    /* nothing */;
Run Code Online (Sandbox Code Playgroud)

一些大胆的程序员写这个更混乱的形式(避免它):

while((c = getchar()) == ' ');
Run Code Online (Sandbox Code Playgroud)

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

while ((c = getchar()) == ' ')
    continue;
Run Code Online (Sandbox Code Playgroud)


tem*_*def 12

该声明

  while((c = getchar()) == ' ')
  ;
Run Code Online (Sandbox Code Playgroud)

被解析为

  while((c = getchar()) == ' ');
Run Code Online (Sandbox Code Playgroud)

效果与...相同

while((c = getchar()) == ' ') {
     /* Do nothing */
}
Run Code Online (Sandbox Code Playgroud)

换句话说,它是一个while循环,它的身体没有效果.检查while循环条件的行为会读取字符并丢弃空格,这就是您要执行的操作.

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

  • 也许你应该提一下,使用一个没有注释的简单分号或任何东西作为一个空语句是非常残酷的风格,因为它很容易被忽视. (5认同)