鱼C论坛

 找回密码
 立即注册
查看: 1888|回复: 3

[已解决]统计字符串有几个单词的程序

[复制链接]
发表于 2018-9-26 05:18:17 | 显示全部楼层 |阅读模式
1鱼币
#include <stdio.h>
#include <string.h>

#define MAX 1024

int main()
{
        char str[MAX];
        char ch;
        int i, n, r = 1, c = 0, mc = 0;
//      char result[r][mc];

        printf("请输入一个英文句子:");

        while((ch = getchar()) != '\n')
        {
                str[i] = ch;
                i++;
        }

        n = strlen(str);

        for (i = 0; i < n; i++)
        {
                if (str[i] == ' ')
                {
                        r++;

                        if (mc < c)
                        {
                                mc = c;
                        }
                        c = 0;
                        continue;
                }
                c++;
        }
        printf("%d,%d\n", r, mc );

        return 0;
}

这个程序目前的功能是输入一段话,根据空格来判断单词数和最长单词长度,运行结果会报segmentation fault
请大神帮忙看看是什么问题! 谢谢!
最佳答案
2018-9-26 05:18:18
本帖最后由 小腿跑乱刀 于 2018-9-26 13:39 编辑

主要原因在于for循环中的if语句,
你的代码是每当遇到一个空格就会进行一次比较,
但是,当输入一系列单词后,最后的一个单词往往是不添加空格而是直接回车的,
这意味着你输入的最后一个单词实际上根本没有进行比较,也就没有纳入统计的结果之中。

当然除了这一个问题还有其他的一些问题需要你自己再思考着改改,比如你的变量r统计的是单词的个数吧,在还没有统计的时候单词个数应该为0,而你将其初始化为了1。
但恰巧就像我前面说的你的程序忽略了输入的最后一个单词,这反而造成了单词个数的统计结果是正确的(但实际上做法是错误的)。

我去上课前大概写了下,参考一下吧,可能也有错
#include <stdio.h>

#define IN 1
#define OUT 0

int main(int argc, char **argv)
{
    int num_word = 0, maxlen = 0, count = 0;
    int state = OUT;
    char c;
    
    int flag;
  
    while((c = getchar()) != '\n')
    {
        flag = (c == ' ' | c == '\t');
        if(!flag & state == OUT)
        {
            state = IN;
            num_word++;
            count++;
        }
        else if(!flag & state == IN)
        {
            count++;
        }
        else if(flag & state == IN)
        {
            if(count > maxlen) maxlen = count;
            state = OUT;
            count = 0;
        }
    }
    if(count > maxlen) maxlen = count;
    printf("num_word:%d  maxlen:%d\n", num_word, maxlen);
    return 0;
}

另外你是统计一句话的单词数,所以我给while的判断条件是不等于'\n',如果要统计一段话的单词书只需要不等于EOF或者不等于一个负整数就行了

最佳答案

查看完整内容

主要原因在于for循环中的if语句, 你的代码是每当遇到一个空格就会进行一次比较, 但是,当输入一系列单词后,最后的一个单词往往是不添加空格而是直接回车的, 这意味着你输入的最后一个单词实际上根本没有进行比较,也就没有纳入统计的结果之中。 当然除了这一个问题还有其他的一些问题需要你自己再思考着改改,比如你的变量r统计的是单词的个数吧,在还没有统计的时候单词个数应该为0,而你将其初始化为了1。 但恰巧就像 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-26 05:18:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 小腿跑乱刀 于 2018-9-26 13:39 编辑

主要原因在于for循环中的if语句,
你的代码是每当遇到一个空格就会进行一次比较,
但是,当输入一系列单词后,最后的一个单词往往是不添加空格而是直接回车的,
这意味着你输入的最后一个单词实际上根本没有进行比较,也就没有纳入统计的结果之中。

当然除了这一个问题还有其他的一些问题需要你自己再思考着改改,比如你的变量r统计的是单词的个数吧,在还没有统计的时候单词个数应该为0,而你将其初始化为了1。
但恰巧就像我前面说的你的程序忽略了输入的最后一个单词,这反而造成了单词个数的统计结果是正确的(但实际上做法是错误的)。

我去上课前大概写了下,参考一下吧,可能也有错
#include <stdio.h>

#define IN 1
#define OUT 0

int main(int argc, char **argv)
{
    int num_word = 0, maxlen = 0, count = 0;
    int state = OUT;
    char c;
    
    int flag;
  
    while((c = getchar()) != '\n')
    {
        flag = (c == ' ' | c == '\t');
        if(!flag & state == OUT)
        {
            state = IN;
            num_word++;
            count++;
        }
        else if(!flag & state == IN)
        {
            count++;
        }
        else if(flag & state == IN)
        {
            if(count > maxlen) maxlen = count;
            state = OUT;
            count = 0;
        }
    }
    if(count > maxlen) maxlen = count;
    printf("num_word:%d  maxlen:%d\n", num_word, maxlen);
    return 0;
}

另外你是统计一句话的单词数,所以我给while的判断条件是不等于'\n',如果要统计一段话的单词书只需要不等于EOF或者不等于一个负整数就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-9-26 05:42:05 | 显示全部楼层
本帖最后由 alstom 于 2018-9-26 05:46 编辑

发现了 是 int i = 0。。
但是出来的结果好像还是不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-26 07:30:31 From FishC Mobile | 显示全部楼层
n = strlen(str);你这里计算的是字符串长度,但是你前面getchar()输入的只是单个的字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 10:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表