0

以下是 Ritchie&Kernighan 的《C 编程语言》一书中练习 1-9 的内容:

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

对我来说,解决这个问题的最简单方法是写作

int single_byte = getchar();

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

尽管有人告诉我(昨晚在irc.freenode.netwhile的 #c 频道中),通过在保存的最后一个字符和刚刚读取的字符之间进行比较,摆脱嵌套会更具可读性。我的想法是这样的:

int current_byte = getchar();

if (current_byte == EOF)
  return 1;

putchar(current_byte);
int previous_byte = current_byte;

while ((current_byte = getchar()) != EOF) {
  if (current_byte == ' ' && previous_byte == ' ')
    ;
  else
    putchar(current_byte);

previous_byte = current_byte;
}

这根本不满足我:从第一个if语句开始(对于没有什么可读的情况)。while另外,我希望我可以在循环内部之前推送最后两行;我越不应该将开始与执行的其余部分区分开来,我就越快乐!

4

1 回答 1

2

该程序不需要多个循环语句或任何其他语句。

这似乎是解决问题的直接方法:

#include <stdio.h>
int main(void) {
    int single_byte;
    int last_char;
    for(last_char = 0; (single_byte = getchar()) != EOF; last_char = single_byte)
    {
        if(last_char != ' ' || single_byte != ' ')
            putchar(single_byte);
    }
}
于 2013-09-28T00:39:39.907 回答