﹏Xem丶 发表于 2013-3-26 19:14:22

C语言“统计字符、单词和行”问题中,实现统计单词出错

/*
      时间:2013年3月26日14:41:19
      程序功能:统计输入的字符、单词和行
*/
#include <stdio.h>
#include <stdbool.h> //为isspace()提供函数原型
#include <ctype.h> //为bool、true和false提供宏定义
#define STOP '|'

int main(void)
{
      char c; //读入字符
      char prev; //前一个读入字符
      long n_chars = 0L; //字符数
      int n_lines = 0; //行数
      int n_words = 0; //单词数
      int p_lines = 0; //不完整的行数
      bool inword = false;

      printf("Enter text to be analyzed (| to terminate): \n");
      prev = '\n'; //用于识别完整的行
      while ((c = getchar()) != STOP)
      {
                n_chars++; //统计字符
                if (c == '\n')
                        n_lines++; //统计行
                if (!isspace && !inword)
                {
                        inword = true; //开始一个新单词
                        n_words++; //统计单词
                }
                if (isspace || inword)
                        inword = false; //到达单词的结尾
                prev = c;
      }

      if (prev != '\n')
                p_lines = 1;
      printf("characters = %ld, words = %d, lines = %d,",
                n_chars, n_words, n_lines);
      printf("partial lines = %d\n", p_lines);
      return 0;
}

C语言“统计字符、单词和行”问题中,实现统计单词出错。上面是源代码。
这个是在vim中运行的结果:

和预期的结果不一样,characters = 55, words = 0, lines = 3,partial lines = 0
characters = 55得到了正确的结果,lines = 3得到了正确的结果,partial lines = 0得到了正确的结果,但是在统计单词words的时候却运行不正确!???请问这是为什么?哪里出问题了吗?

上面是vim中的运行结果和源代码。下面也在VC++6.0中测试了下:
因为在VC++6.0中用isspace()函数编译的时候出错,所以我把代码改成了这样:
/*
      时间:2013年3月26日14:41:19
      程序功能:统计输入的字符、单词和行
*/
#include <stdio.h>
//#include <stdbool.h> //为isspace()提供函数原型
#include <ctype.h> //为bool、true和false提供宏定义
#define STOP '|'

int main(void)
{
      char c; //读入字符
      char prev; //前一个读入字符
      long n_chars = 0L; //字符数
      int n_lines = 0; //行数
      int n_words = 0; //单词数
      int p_lines = 0; //不完整的行数
      bool inword = false;

      printf("Enter text to be analyzed (| to terminate): \n");
      prev = '\n'; //用于识别完整的行
      while ((c = getchar()) != STOP)
      {
                n_chars++; //统计字符
                if (c == '\n')
                        n_lines++; //统计行
                if (c != ' ' && c != '\n' && c != '\t')
                {
                        inword = true; //开始一个新单词
                        n_words++; //统计单词
                }
                if (c == ' ' || c == '\n' || c == '\t')
                        inword = false; //到达单词的结尾
                prev = c;
      }

      if (prev != '\n')
                p_lines = 1;
      printf("characters = %ld, words = %d, lines = %d,",
                n_chars, n_words, n_lines);
      printf("partial lines = %d\n", p_lines);
      return 0;
}在VC++6.0中运行的结果是这样的:

这里也是统计单词的时候没有运行正确!!
并且words统计的时候统计了字符的个数,而不是单词!请问这个又是哪里错了?
统计单词我的思路是这样的,讲一个单词定义为不包含空白字符(也就是说,没有空格,制表符或换行符)的一系列字符。因此,“dtz”和“asdasd”是单词。一个单词以程序首次遇到非空白符开始,在下一个空白符出现时结束。检测非空白符最简单了的判断表达式是这样的:
c != ' ' && c != '\n' && c != '\t'检测空白字符最简单明了的判断是:
c == ' ' || c == '\n' || c == '\t'
这个可以用ctype.h文件中的isspace()函数来解决。如果该函数的参数是空白字符,它就返回真。因此如果是c是空白字符,isspace为真;而如果c不是空白字符,!isspace为真。
之前说过,因为VC++6.0中用isspace函数时错误,所以改用了比较复杂的公式c != ' ' && c != '\n' && c != '\t'和c == ' ' || c == '\n' || c == '\t'来代替isspace,并在vim中用isspace代替比较复杂的公式运行。两个运行结果都和预期不一样,并且出现了不一样的结果。
请问这个是什么问题导致的?
这个程序错了吗?
我觉得思路是没有错的,因为这是CPP书上的,
如果错了要怎么写才能实现统计单词?

﹏Xem丶 发表于 2013-3-26 19:17:52

不知道为什么有些字体有背景色了。。。:(

小新110 发表于 2013-3-26 20:16:36

计算单词的地方有一点小错误
代码:
/*
      时间:2013年3月26日14:41:19
      程序功能:统计输入的字符、单词和行
*/
#include <stdio.h>
//#include <stdbool.h> //为isspace()提供函数原型
#include <ctype.h> //为bool、true和false提供宏定义
#define STOP '|'

int main(void)
{
      char c; //读入字符
      char prev; //前一个读入字符
      long n_chars = 0L; //字符数
      int n_lines = 0; //行数
      int n_words = 0; //单词数
      int p_lines = 0; //不完整的行数
      bool inword = false;

      printf("Enter text to be analyzed (| to terminate): \n");
      prev = '\n'; //用于识别完整的行
      while ((c = getchar()) != STOP)
      {
                n_chars++; //统计字符
                if (c == '\n')
                        n_lines++; //统计行
                if (c != ' ' && c != '\n' && c != '\t')
                {
                        inword = true; //开始一个新单词
                }
                if (c == ' ' || c == '\n' || c == '\t' )
                                {
                        inword = false; //到达单词的结尾                                               
                        n_words++; //统计单词
                                }
                prev = c;
      }

      if (prev != '\n')
                {
                p_lines = 1;
                                n_words++;
                }
      printf("characters = %ld, words = %d, lines = %d,",
                n_chars, n_words, n_lines);
      printf("partial lines = %d\n", p_lines);
                _flushall();
                getchar();
      return 0;
}

小新110 发表于 2013-3-26 20:17:30

结果:

请大师赐教 发表于 2013-3-28 14:25:44

会贴 收鱼币

SXDA 发表于 2013-4-2 13:11:02

回帖拿钱~~

小亮1201 发表于 2013-4-2 16:46:03

回帖收鱼币

无法简单 发表于 2013-4-3 12:56:55

来收钱的。

知遇 发表于 2013-5-17 23:49:17

楼主加油,鱼C加油!我们都看好你哦!

xmmy520 发表于 2013-5-29 14:36:30

强烈支持楼主ing……

Skyline 发表于 2013-5-29 23:25:25

学习学习。。。。。。。

喜欢散步 发表于 2013-5-30 01:59:50

用函数应很好做的。

心驰神往 发表于 2020-11-4 15:19:59

顶上去

心驰神往 发表于 2020-11-4 15:20:31

拿鱼币

心驰神往 发表于 2020-11-4 15:21:16

{:10_324:}

乐乐学编程 发表于 2020-11-4 23:48:49

都是高手,向你们学习
页: [1]
查看完整版本: C语言“统计字符、单词和行”问题中,实现统计单词出错