c - C 编程语言,比较练习 1-9 和 1-12 的解决方案时的困惑
问题描述
作为一名编程新手,我一直在尝试自学 C,以便使用 C 编程语言(第 2 版)更好地理解计算机。
到目前为止,该站点在解决问题方面非常有帮助,但是有一个问题我无法解决。这是我提出的练习 1-12 的解决方案,使用我对 1-9 的解决方案作为背景。我想知道这个在线社区中是否有人会指出我哪里出错了。
练习 1-9 要求你“编写一个程序将其输入复制到其输出,用一个空格替换多个空格中的每个字符串”
有很多方法可以在这里给众所周知的猫剥皮,但对我来说最简单的解决方案是:
int c;
while((c = getchar()) != EOF)
{
if(c == ' ')
{
putchar(' ');
while((c = getchar()) == ' ') // if there are subsequent blanks
; // do nothing
}
if(c != EOF)
putchar(c);
}
现在练习 1-12 要求你“编写一个程序,每行打印一个单词。 ”
我的第一次尝试是成功的,但问题过于简单化了。
int c;
while((c = getchar()) != EOF)
{ if(c == ' ')
putchar('\n');
else
putchar(c);
}
所以我试图纠正这一点以接受更广泛的输入,这是结果
int c;
while((c = getchar()) != EOF)
{
if(c == ' ' || c == '\t' || c == '\n')
{
putchar('\n');
while((c = getchar()) == ' ' || (c = getchar()) == '\t' || (c = getchar()) == '\n')
;
}
if(c != EOF)
putchar(c);
}
现在我知道当我运行它时这是错误的,并且我在网上查找了其他非常简单的方法来解决问题。
我的问题是我不明白为什么它不起作用。对我来说,如果 1-9 的解决方案有效,我不明白为什么当我将相同的原则应用于 1-12 时它会失败。任何能指出这一点的人将不胜感激!
解决方案
您所做的几乎是正确的,但每次调用都会getchar()
消耗一个输入字符。
你可以写
while ((c = getchar()) == ' ' || c == '\t' || c == '\n')
因为||
运算符是从左到右处理的,中间有所谓的序列点;
虽然更清楚的是将初始化c
移出循环条件。
最后,使用isspace
它会消耗任何空白字符,输入更少:
#include <ctype.h>
int c;
do {
c = getchar();
} while (isspace(c));