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