C编程:计算另一个文本文件中的字符,单词和行数

时间:2017-03-04 20:40:42

标签: c

我刚刚开始学习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;
}

感谢您提供任何帮助或建议

1 个答案:

答案 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);