我刚刚开始学习C语言,正如主题所说,我必须编写一个代码来读取另一个文本文件并计算"字符的数量"," words& #34;和"句子"直到达到EOF
。我目前的问题是我无法产生正确的输出。
例如包含以下内容的文本文件......
the world
is a great place.
lovely
and wonderful
应该输出39个字符,9个单词和4个句子,不知怎的,我得到50个(字符)1个(单词)1个(句子)
这是我的代码:
#include <stdio.h>
int main()
{
int x;
char pos;
unsigned int long charcount, wordcount, linecount;
charcount = 0;
wordcount = 0;
linecount = 0;
while(pos=getc(stdin) != EOF)
{
if (pos != '\n' && pos != ' ')
{
charcount+=1;
}
if (pos == ' ' || pos == '\n')
{
wordcount +=1;
}
if (pos == '\n')
{
linecount +=1;
}
}
if (charcount>0)
{
wordcount+=1;
linecount+=1;
}
printf( "%lu %lu %lu\n", charcount, wordcount, linecount );
return 0;
}
感谢您提供任何帮助或建议
答案 0 :(得分:2)
由于运算符优先级,下面两行是相同的。
// Not what OP needs
pos=getc(stdin) != EOF
pos=(getc(stdin) != EOF)
相反,请使用()
while((pos=getc(stdin)) != EOF)
使用int ch
区分fgetc()
返回的值,这些值是unsigned char
范围和EOF
中的值。通常257个不同,对于char
来说太多了。
int main() {
unsigned long character_count = 0;
unsigned long word_count = 0;
unsigned long line_count = 0;
unsigned long letter_count = 0;
int pos;
while((pos = getc(stdin)) != EOF) {
...
您也可以查看字数策略。 @Tony Tannous
对我来说,我会算一个&#34;字&#34;任何时候发生的信件都不符合非信函。这避免了问题@Tony Tannous和其他问题。同样地,我会将行算作跟随'\n'
或第一个的任何字符,并避免任何后循环计算。这会处理由Weather Vane评论的问题。
它还显示39是字母计数而不是字符数@BLUEPIXY。
建议使用<ctype.h>
函数来测试字母(isapha()
)
int previous = '\n';
while((pos = getc(stdin)) != EOF) {
character_count++;
if (isalpha(pos)) {
letter_count++;
if (!isalpha(previous)) word_count++;
}
if (previous == '\n') line_count++;
previous = pos;
}
printf("characters %lu\n", character_count);
printf("letters %lu\n", letter_count);
printf("words %lu\n", word_count);
printf("lines %lu\n", line_count);