简单的字符计数程序表现异常
Simple char-counting program behaves strangely
这段代码应该计算用户输入的字符数,除了'\n',期望'\n'跟在其他'\n'之后。稍后我会解释这个。
#include <stdio.h>
int main () {
int numberOfChars = 0;
do {
while(getchar() != '\n')
numberOfChars++;
} while(getchar() != EOF && numberOfChars++);
printf("Number of chars = %d\n", numberOfChars);
return 0;
}
这里有一些例子:
输入:
A,B,C, Ctrl + D
预期输出:3
实际输出:程序没有终止,并在屏幕上显示123^D
。
输入:
A,B,C, 回车, Ctrl + D
预期输出:3
实际输出:3
输入:
A,B,C, 输入, A, B,C,输入, Ctrl + D
预期输出:6
实际输出:6
输入:
A,B,C, 输入, 输入, Ctrl + D
预期输出:4
实际输出:程序没有终止,并且在屏幕上显示:
abc
^D
我正在使用 OS X-10.10.5、bash-3.2 和 clang-700.1.81。
提前致谢。
您有 2 个 getchar()
调用 - 其中一个可以读取 EOF 或“\n”。你需要重构所以只有一个 getchar()
.
例如在你的第一个例子中没有'\n',所以你永远不会离开内部 while 循环。在你的第四个例子中,第二个 '\n' 被第二个 getchar
读取,所以你再次陷入内部 while 。
当内部循环返回 EOF
时,它不等于 '\n'
,因此循环再次尝试,得到另一个 EOF
,但它仍然不是 '\n'
,所以它还有另一条路。电脑很有耐心…
在内循环中,使用:
int c;
while ((c = getchar()) != EOF && c != '\n')
numberOfChars++;
这将在 EOF 或到达行尾时停止。
另请参阅我对您的 answer 的讨论 — 尽管我错过了内循环的 EOF 问题。
对上面 Jonathan 的回答稍作修改(以确保循环仅以 EOF 而不是 '\n' 停止):
编辑:此外,这是单循环解决方案(不需要外循环和内循环)。
int c;
while ((c = getchar()) != EOF)
{
if(c != '\n') numberOfChars++;
}
首先,我必须为我的问题中令人困惑的描述道歉:
...... except
'\n', expect '\n's following other '\n'.
我的意思是:
...... except
('\n', expect '\n's following other '\n').
所以我的第四个例子没有错字。
最后想出了一个解决办法:
#include <stdio.h>
int main () {
int numberOfChars = 0;
int c;
do {
while((c = getchar()) != '\n' && c != EOF )
numberOfChars++;
while((c = getchar()) == '\n')
numberOfChars++;
} while(c != EOF && numberOfChars++);
printf("Number of chars = %d\n", numberOfChars);
return 0;
}
我相信这段代码可以很好地展示我想要的东西。
这段代码应该计算用户输入的字符数,除了'\n',期望'\n'跟在其他'\n'之后。稍后我会解释这个。
#include <stdio.h>
int main () {
int numberOfChars = 0;
do {
while(getchar() != '\n')
numberOfChars++;
} while(getchar() != EOF && numberOfChars++);
printf("Number of chars = %d\n", numberOfChars);
return 0;
}
这里有一些例子:
输入: A,B,C, Ctrl + D
预期输出:3
实际输出:程序没有终止,并在屏幕上显示123^D
。
输入: A,B,C, 回车, Ctrl + D
预期输出:3
实际输出:3
输入: A,B,C, 输入, A, B,C,输入, Ctrl + D
预期输出:6
实际输出:6
输入: A,B,C, 输入, 输入, Ctrl + D
预期输出:4
实际输出:程序没有终止,并且在屏幕上显示:
abc
^D
我正在使用 OS X-10.10.5、bash-3.2 和 clang-700.1.81。
提前致谢。
您有 2 个 getchar()
调用 - 其中一个可以读取 EOF 或“\n”。你需要重构所以只有一个 getchar()
.
例如在你的第一个例子中没有'\n',所以你永远不会离开内部 while 循环。在你的第四个例子中,第二个 '\n' 被第二个 getchar
读取,所以你再次陷入内部 while 。
当内部循环返回 EOF
时,它不等于 '\n'
,因此循环再次尝试,得到另一个 EOF
,但它仍然不是 '\n'
,所以它还有另一条路。电脑很有耐心…
在内循环中,使用:
int c;
while ((c = getchar()) != EOF && c != '\n')
numberOfChars++;
这将在 EOF 或到达行尾时停止。
另请参阅我对您的 answer 的讨论 — 尽管我错过了内循环的 EOF 问题。
对上面 Jonathan 的回答稍作修改(以确保循环仅以 EOF 而不是 '\n' 停止):
编辑:此外,这是单循环解决方案(不需要外循环和内循环)。
int c;
while ((c = getchar()) != EOF)
{
if(c != '\n') numberOfChars++;
}
首先,我必须为我的问题中令人困惑的描述道歉:
...... except '\n', expect '\n's following other '\n'.
我的意思是:
...... except ('\n', expect '\n's following other '\n').
所以我的第四个例子没有错字。
最后想出了一个解决办法:
#include <stdio.h>
int main () {
int numberOfChars = 0;
int c;
do {
while((c = getchar()) != '\n' && c != EOF )
numberOfChars++;
while((c = getchar()) == '\n')
numberOfChars++;
} while(c != EOF && numberOfChars++);
printf("Number of chars = %d\n", numberOfChars);
return 0;
}
我相信这段代码可以很好地展示我想要的东西。