【发布时间】:2016-01-19 22:18:09
【问题描述】:
我正在做这本书的练习 1-9(编写一个程序以将其输入复制到其输出,将一个或多个空格的每个字符串替换为一个空格),但我似乎不太明白。到目前为止,这是我的代码:
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF)
if (c == ' ') {
while (c == ' ') {
c = getchar();
}
putchar(' ');
} else {
putchar(c);
}
return 0;
}
这是错误的,因为句子 hey(blank)(blank)(blank)now 是 hey ow。总是删除最后一个空格后的第一个字母。我认为这是一个非常愚蠢的错误,但我不知道如何修复它。我会很感激任何建议。
PS:对不起我的英语,如果你有什么不明白的地方,请告诉我。
【问题讨论】:
-
首先要做的是正确缩进你的代码。
while循环内的语句应该比while行缩进更多,依此类推。这将使您更容易在您的脑海中遵循程序的流程。你不应该在同一缩进级别有两个连续的} -
while (c == ' '){ c = getchar(); }: 循环中断时,需要ungetc(c, stdin) -
它可能会帮助您拿起笔和纸,思考
c发生了什么以及您打印到输出的内容。在您的情况下,问题是您忽略了在内部 while 循环中读取的c的最后一个值。 -
看代码就行了。当 'while (c == ' ')' 失败时会发生什么?
-
好吧,按照逻辑。当你有一个空格后跟一个非空格时会发生什么?你跳过空格,直到你读到非空格字符,然后你打印一个空格,然后你继续下一个循环迭代,你读一个新字符,丢弃你之前读过的非空格。所以在打印完空格后,你需要对下一个字符做一些事情。您可以使用
ungetc将其放回输入流中。这是解决问题的一种方法。