鱼C论坛

 找回密码
 立即注册
查看: 1344|回复: 6

[已解决]字符统计程序求纠错!! 来自小甲鱼课后作业~!

[复制链接]
发表于 2018-11-17 11:13:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目~!
根据要求再写一个字符统计程序,不过这个要更复杂一些。
要求 A:统计用户输入的所有字符个数;
要求 B:统计不同的字符个数,并打印出来
要求 C:找出出现次数最多的字符。

我的代码:
#include <stdio.h>
#include <string.h>

#define MAX 128
int main()
{
        char str1[MAX];
        char str2[MAX];//这个数组储存不同的字符
        int i=0,j,k=0,r,flag,space1,space2;
        int count=1,temp,max;
        
        printf("请输入英文文本:");
        while((str1[i++]=getchar())!='\n')
        {        space1=i;
                for(j=0;j<i;j++)
                {
                        flag=0;
                        if(!(str1[i]-str1[j]))
                        {flag=1;break;}//flag用于表示录入的该字符是否不曾在前面出现,只要出现一次就是1.
                }
                if(!flag)//如果是新字符flag就是0,在str2储存这个新字符。
                {        str2[k++]=str1[i];
                        space2=k;
                }
        }
        str1[space1]='\0';
        str2[space2]='\0';
        
        for(j=0;j<k;i++);//用str2中的每个字符与str1中的每个字符相减
        {
                for(r=0;r<i;r++)
                {
                        temp=1;
                        if(!(str2[j]-str1[r]))
                        {temp+=1;}//如果差是0 就往上加一个
                }
                if(temp>count)//但是count只记录重复数temp最大的值 只输出重复数最大的元素
                {
                        count=temp; max=j;
                }
        }

        printf("你总共输入了%d个字符,其中不同的字符个数有%d个.\n" ,strlen(str1),strlen(str2));
        printf("它们是:%s\n" ,str2);
        printf("出现最多的字符是‘%c’,它总共出现了%d次\n" ,str2[max],count);

        return 0;

}
问题在于:我这个程序从一开始就无法执行!!
显示了请输入英文文本:
我可以往里输入字符串 比如abcdefsfdgd
可是我按了回车以后没有下一步反应!!!
光标移到了下一行 但是什么也没有再显示 也不能再输入字符!
好难受啊 之前也有过这种情况 参考答案能改回来
可这次和小甲鱼答案思路不太一样(没有他那么秀),不想把自己的思路全部推倒对着答案重来一遍,而且
while((str1[i++]=getchar())!='\n')
我是从小甲鱼那里学来的,难道出了问题吗?还是因为我用的是VC6.0版本问题所以不行。

最佳答案
2018-11-18 12:13:49
我也调了好一会,这个j的值老是不正常,后来发现31行最后for();这里多个分号,for循环体根本就进不去啊,
写代码的时候注意;后空几格再写注释,不然你这写在一起很难看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-17 16:33:19 | 显示全部楼层
上面程序第29行  ==>  for(j=0;j<k;i++);//用str2中的每个字符与str1中的每个字符相减
i++是不是应该换成j++?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-17 22:28:27 | 显示全部楼层
本帖最后由 冲鸭小小苏 于 2018-11-17 22:32 编辑
moc 发表于 2018-11-17 16:33
上面程序第29行  ==>  for(j=0;j


谢谢...改了一下就整出来了..然后更多的问题暴露了
图片不好传描述一下把...
显示请输入英文文本:
我输入了WOWWWW
按完回车是 你总共输入了6个字符,其中不同的字符个数有6个
                 它们是:烫烫烫
                 出现最多的字符是' ',它总共出现了2次
??更加蒙逼了 感觉是在\0上出了问题..?还是越界什么的问题..?
刚学c语言 这块真的不懂..不会改...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-17 23:24:50 | 显示全部楼层
本帖最后由 冲鸭小小苏 于 2018-11-17 23:26 编辑

又修改更新了一下代码 改正了很多问题 但是在要求C上的问题还是没法解决....
显示打的最多的字符是? 出现了0次...
那一段对应代码后一部分 翻来覆去仔细看了很多很多次..就是看不出来哎
#include <stdio.h>
#include <string.h>

#define MAX 128
int main()
{
        char str1[MAX];
        char str2[MAX];//这个数组储存不同的字符
        int i=0,j,k=0,r,flag=0,space1,space2;
        char max;
        int count=0,temp;
        
        printf("请输入英文文本:");
        while((str1[i]=getchar())!='\n')
        {
                for(j=0;j<i&&i>0;j++)
                {
                        flag=0;
                        if(!(str1[i]-str1[j]))
                        {flag=1;break;}//flag用于表示录入的该字符是否不曾在前面出现,只要出现一次就是1.
                }
                if(!flag)//如果是新字符flag就是0,在str2储存这个新字符。
                {        str2[k++]=str1[i];
                        space2=k;
                }
                space1=++i;
        }
        str1[space1]='\0';
        str2[space2]='\0';
        
        for(j=0;j<k;j++);//用str2中的每个字符与str1中的每个字符相减
        {
                temp=0;
                for(r=0;r<i;r++)
                {
                        if(!(str2[j]-str1[r]))
                        {temp++;}//如果差是0 就往上加一个
                }
                if(temp>count)//但是count只记录重复数temp最大的值 只输出重复数最大的元素
                {
                        count=temp; max=j;
                }
        }

        printf("你总共输入了%d个字符,其中不同的字符个数有%d个.\n" ,strlen(str1),strlen(str2));
        printf("它们是:%s\n" ,str2);
        printf("出现最多的字符是%c,它总共出现了%d次\n"  ,str2[max] ,count);

        return 0;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-18 12:13:49 | 显示全部楼层    本楼为最佳答案   
我也调了好一会,这个j的值老是不正常,后来发现31行最后for();这里多个分号,for循环体根本就进不去啊,
写代码的时候注意;后空几格再写注释,不然你这写在一起很难看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-11-18 15:37:03 | 显示全部楼层
#include <stdio.h>
#include <string.h>

int main(void)
{
        char buf[512];
        printf("请输入英文文本: ");
        fgets(buf, 512, stdin);
        int len = strlen(buf);
        buf[--len] = '\0';        // 去掉末尾的'\n'

        char table[128] = {0};
        for(int i = 0; i < len; ++i)
                ++table[buf[i]];
        
        int count = 0;
        for(int i = 0; i < 128; ++i)
        {
                if(table[i])
                        ++count;
        }
        printf("你总共输入了%d个字符,其中不同的字符个数有%d个.\n", len, count);
        printf("它们是: ");
        for(int i = 0; i < 128; ++i)
        {
                if(table[i])
                        putchar(i);
        }
        printf("\n");

        int max = 0;
        char ch = 0;
        for(int i = 0; i < 128; ++i)
        {
                if(table[i] > max)
                {
                        max = table[i];
                        ch = i;
                }
        }
        printf("出现最多的字符是'%c',它总共出现了%d次\n", ch, max);
        return 0;
}

评分

参与人数 1荣誉 +5 收起 理由
冲鸭小小苏 + 5 谢谢你!!!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-18 17:43:55 | 显示全部楼层
moc 发表于 2018-11-18 12:13
我也调了好一会,这个j的值老是不正常,后来发现31行最后for();这里多个分号,for循环体根本就进不去啊,
...

啊啊啊啊啊 真的是这样谢谢你了 一点点小细节搞了这么大的岔子= =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-2 22:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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