【问题标题】:K&R - Exercise 1-9 - Removing Spaces [duplicate]K&R - 练习 1-9 - 删除空格 [重复]
【发布时间】:2017-12-21 03:54:18
【问题描述】:

我最近开始使用 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);
  }
}

提前致谢。

【问题讨论】:

  • 我不喜欢那个“解决方案”,因为它不会检查最里面的 getchar() 中的 EOF。
  • 注意,代码也有缺陷。输入" " + EOF,代码将调用putchar(' '); putchar(EOF);,而它只应该调用putchar(' ');(我看到这是暗示here)。
  • K&R 不是学习 C 语言的好参考,因为它不再是 1979 年,而且该书中的许多实践、建议和代码示例都是根本不正确或不相关

标签: c string while-loop


【解决方案1】:

声明:

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

缩进不正确。它应该是:

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

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

这个孤独的; 有点混乱,所以添加评论或其他强调以阐明其真实性质被认为是一种很好的风格:

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

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

一些大胆的程序员会写出这种更令人困惑的形式(避免使用):

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

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

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

【讨论】:

    【解决方案2】:

    声明

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

    被解析为

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

    效果和

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

    换句话说,它是一个while循环,它的主体没有任何作用。检查 while 循环条件的行为读取字符并丢弃空格,这就是您想要做的。

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

    【讨论】:

    • 也许你应该提一下,使用没有注释或任何内容的简单分号作为空语句是很糟糕的风格,因为它很容易被忽略。
    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多