鱼C论坛

 找回密码
 立即注册
查看: 101|回复: 2

[已解决]头炸了!!!SIE19最后一道动手题,不能稳定执行,问题在哪里?

[复制链接]
最佳答案
2 
发表于 2019-12-1 13:07:20 | 显示全部楼层 |阅读模式
1鱼币
各位大佬,如题,小弟在做课后习题时,最后一题遇到了感觉很奇怪的问题,具体如下:

执行结果.png

从图中可以看出,运行结果异常,出现了乱码,并且我输入了15个字符,但提示有22个不同的!
这种情况并非每次都发生,在输入字符数较少时运行正常,为了方便大佬调试问题,小弟又抄了一遍代码(PS代码是在虚拟机LINUX系统上执行的),代码如下:

#include<stdio.h>
#include<string.h>

int main()
{
        char zifu[206],cc;
        int count[206],i,length,flag = 0,sum=0,id=0;

//        初始化字符计数数组元素值都为0
        for(i=0;i<206;i++)
        {
                count=0;
        }
       
        printf("请输入英文文本:");
       
        while(1){
                length = strlen(zifu);//获取字符数组长度
                cc=getchar();
                if(cc=='\n')
                {
                        break;
                }
                printf("length:%d",length);//添加的测试语句,看长度究竟如何变化的
                for(i=0;i<length;i++)
                {
                        if(cc==zifu)
                        {
                                count++;
                                flag = 1;
                        }
                }
                if (flag ==0)
                {
                        zifu[length] == cc;
                        printf("zifu_new:%c\n",zifu[length]);//测试语句,看新增元素是否正确
                        count[length]=1;
               
                }
                flag=0;
        }
       
        for(i = 0;i<=length;i++)
        {
                sum += count;
        }
        printf("你总共输入了%d个字符,其中不同的字符数有%d个\n",sum,length);
        printf("他们是:");
        for(i=0;i<=length;i++)
        {
                printf("%c",zifu);
        }
        putchar('\n');
        for(i=0;i<=length;i++)
        {
                if(count[id]<count)
                {
                        id = i;
                }
        }
        printf("出现次数最多的字符是'%c',它总共出现了%d次。\n",zifu[id],count[id]);

        return 0;
}

请各位大佬费心指教!
最佳答案
2019-12-1 13:07:21
本帖最后由 superbe 于 2019-12-1 18:29 编辑

1.  zifu数组没有初始化,strlen需要\0才能得到正确的字符串长度
     char zifu[206] = {0}   或  char zifu[206] = ""
2.  if (flag ==0)
     {
        zifu[length] == cc;  //这行 == 应该是 =
3.  有三处 for (i = 0; i <= length; i++)   //这行 <= 应该是 <
贴代码最好用<>,不然都乱了,[ i ]被当成了斜体格式。

count数组初始化可以这样 int count[206] = {0}

最佳答案

查看完整内容

1. zifu数组没有初始化,strlen需要\0才能得到正确的字符串长度 char zifu[206] = {0} 或 char zifu[206] = "" 2. if (flag ==0) { zifu[length] == cc; //这行 == 应该是 = 3. 有三处 for (i = 0; i
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
111 
发表于 2019-12-1 13:07:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 superbe 于 2019-12-1 18:29 编辑

1.  zifu数组没有初始化,strlen需要\0才能得到正确的字符串长度
     char zifu[206] = {0}   或  char zifu[206] = ""
2.  if (flag ==0)
     {
        zifu[length] == cc;  //这行 == 应该是 =
3.  有三处 for (i = 0; i <= length; i++)   //这行 <= 应该是 <
贴代码最好用<>,不然都乱了,[ i ]被当成了斜体格式。

count数组初始化可以这样 int count[206] = {0}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
发表于 2019-12-1 18:59:05 | 显示全部楼层
粗略看,都存在2个问题:
1. 定义了zifu和count 2个数组,但是很多地方都是直接操作的数组的指针。如果没猜错的话,LZ应该是想操作数组成员的值。
2. strlen()获取的是字符串指针之后,到以字符‘\0’为结尾的之间的字符个数。如果也没猜错的话,LZ是想获取每次更新后的字符数组中已经保存了的字符个数,从而可以遍历已存的字符,并根据情况新增字符到数组中。
    有个建议,LZ可以把zifu这个数组所有成员初始化为‘\0’,就可以使用strlen()来获取个数。
LZ可以先好好考虑下以上的2个问题并修改测试下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号

GMT+8, 2019-12-12 18:43

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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