计数逻辑是错误的。此代码似乎可以正确处理前导和尾随空格以及单词之间的多个空格等。请注意使用,int ch;
以便代码可以准确地检查 EOF(getchar()
返回一个int
)。
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int ch;
int numWords = 0;
int numLetters = 0;
bool prevWasASpace = true; //spaces at beginning are ignored
printf("Enter a sentence: ");
while ((ch = getchar()) != EOF && ch != '\n')
{
if (ch == ' ')
prevWasASpace = true;
else
{
if (prevWasASpace)
numWords++;
prevWasASpace = false;
numLetters++;
}
}
if (numWords > 0)
{
double avg = numLetters / (float)(numWords);
printf("Average word length: %.1f (C = %d, N = %d)\n", avg, numLetters, numWords);
}
else
printf("You didn't enter any words\n");
return 0;
}
各种示例运行,#
用于指示Return被击中的位置。
Enter a sentence: A human in Algiers#
Average word length: 3.8 (C = 15, N = 4)
Enter a sentence: A human in Algiers #
Average word length: 3.8 (C = 15, N = 4)
Enter a sentence: A human in Algiers #
Average word length: 3.8 (C = 15, N = 4)
Enter a sentence: #
You didn't enter any words
Enter a sentence: A human in AlgiersAverage word length: 3.8 (C = 15, N = 4)
Enter a sentence: You didn't enter any words
在最后一个示例中,我输入Control-D了两次(第一次将“阿尔及尔的人类”刷新到程序中,第二次输入 EOF),在最后一个示例中输入了一次。请注意,此代码将制表符计为“非空格”;你需要#include <ctype.h>
和if (isspace(ch))
(或if (isblank(ch))
)代替if (ch == ' ')
更好地处理标签。
getchar()
返回一个int
我很困惑你为什么使用int ch
and EOF
!
这个答案有几个部分。
使用的第一个原因int ch
是该getchar()
函数返回一个int
. 它可以返回任何有效字符加上一个单独的值 EOF;因此,它的返回值不能是char
任何类型的,因为它必须返回比 a 容纳的更多的值char
。它实际上返回一个int
.
为什么这有关系?假设 from 的值getchar()
被分配给char ch
。现在,对于大多数角色来说,大多数时候,它都可以正常工作。但是,会发生两种情况之一。如果 plainchar
是有符号类型,则有效字符(通常为 ÿ、y-变音符号、0xFF、正式的 Unicode U+00FF、带分音符号的拉丁小写字母 Y)被误识别为 EOF。或者,如果 plainchar
是无符号类型,那么您将永远不会检测到 EOF。
为什么检测 EOF 很重要?因为您的输入代码可能会在您不期望的情况下获得 EOF。如果您的循环是:
int ch;
while ((ch = getchar()) != '\n')
...
并且输入达到EOF,程序将花费很长时间无所事事。该getchar()
函数会重复返回EOF,而EOF不是'\n'
,所以循环会再试一次。始终检查输入函数中的错误条件,无论该函数是、 、getchar()
还是scanf()
它们的无数亲属。fread()
read()