为什么此代码有效,而其他版本无效?

分享于2022年10月08日 c kernighan-and-ritchie loops 问答
【问题标题】:Why does this code work but the other version does not?为什么此代码有效,而其他版本无效?
【发布时间】:2022-10-07 08:34:30
【问题描述】:

具体来说,代码是一个解决方案 练习 1-9 在 K&R C 编程语言第 2 版 .我已经解决了,但我有一个问题。

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

此代码有效并返回所需的输出

int ch, last;

for (last = 0; (ch = getchar()) != EOF; last = ch)
    if (ch == \' \' && last == \' \')
        ;
    else
        putchar(ch);

此版本的代码不起作用,而是按字面意思打印包含多余空格的相同输入。

int ch, last;
last = 0;

while ((ch = getchar()) != EOF)
    if (ch == \' \' && last == \' \')
        ;
    else
        putchar(ch);
    
    last = ch;

有人可以告诉我这两个版本的代码之间的区别以及为什么后一个版本不起作用?

  • 请注意,缩进在这里无关紧要;两个循环的内容只是下面的一个语句(在这两种情况下,只是一个 if 语句)。

【解决方案1】:

last = ch; 不在循环内,因此在阅读整个文件之前不要设置它。因此,您每次都在与 0 进行比较。

如果你想在一个循环中有多个语句,你必须在它们周围加上 {}

while ((ch = getchar()) != EOF) {
    if (ch == ' ' && last == ' ') {
    } else {
        putchar(ch);
    }
    last = ch;
}

这是 Why is it considered a bad practice to omit curly braces? 的完美示例

【讨论】: