关于K& R的EX1-9

时间:2013-09-28 00:19:05

标签: c getchar

以下是Ritchie& Kernighan撰写的“The C programming language”一书中练习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.net 的#c频道),通过实现之间的比较来摆脱嵌套的while会更具可读性。保存的最后一个字符和刚读过的字符。我的想法是这样的:

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之前推送最后两行;我应该越少区分开始与执行的其余部分,我就越快乐!

1 个答案:

答案 0 :(得分: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);
    }
}