鱼C论坛

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

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

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

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

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

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

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

  3. #define MAX 128
  4. int main()
  5. {
  6.         char str1[MAX];
  7.         char str2[MAX];//这个数组储存不同的字符
  8.         int i=0,j,k=0,r,flag,space1,space2;
  9.         int count=1,temp,max;
  10.        
  11.         printf("请输入英文文本:");
  12.         while((str1[i++]=getchar())!='\n')
  13.         {        space1=i;
  14.                 for(j=0;j<i;j++)
  15.                 {
  16.                         flag=0;
  17.                         if(!(str1[i]-str1[j]))
  18.                         {flag=1;break;}//flag用于表示录入的该字符是否不曾在前面出现,只要出现一次就是1.
  19.                 }
  20.                 if(!flag)//如果是新字符flag就是0,在str2储存这个新字符。
  21.                 {        str2[k++]=str1[i];
  22.                         space2=k;
  23.                 }
  24.         }
  25.         str1[space1]='\0';
  26.         str2[space2]='\0';
  27.        
  28.         for(j=0;j<k;i++);//用str2中的每个字符与str1中的每个字符相减
  29.         {
  30.                 for(r=0;r<i;r++)
  31.                 {
  32.                         temp=1;
  33.                         if(!(str2[j]-str1[r]))
  34.                         {temp+=1;}//如果差是0 就往上加一个
  35.                 }
  36.                 if(temp>count)//但是count只记录重复数temp最大的值 只输出重复数最大的元素
  37.                 {
  38.                         count=temp; max=j;
  39.                 }
  40.         }

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

  44.         return 0;

  45. }
复制代码

问题在于:我这个程序从一开始就无法执行!!
显示了请输入英文文本:
我可以往里输入字符串 比如abcdefsfdgd
可是我按了回车以后没有下一步反应!!!
光标移到了下一行 但是什么也没有再显示 也不能再输入字符!
好难受啊 之前也有过这种情况 参考答案能改回来
可这次和小甲鱼答案思路不太一样(没有他那么秀),不想把自己的思路全部推倒对着答案重来一遍,而且
  1. 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次...
那一段对应代码后一部分 翻来覆去仔细看了很多很多次..就是看不出来哎
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define MAX 128
  4. int main()
  5. {
  6.         char str1[MAX];
  7.         char str2[MAX];//这个数组储存不同的字符
  8.         int i=0,j,k=0,r,flag=0,space1,space2;
  9.         char max;
  10.         int count=0,temp;
  11.        
  12.         printf("请输入英文文本:");
  13.         while((str1[i]=getchar())!='\n')
  14.         {
  15.                 for(j=0;j<i&&i>0;j++)
  16.                 {
  17.                         flag=0;
  18.                         if(!(str1[i]-str1[j]))
  19.                         {flag=1;break;}//flag用于表示录入的该字符是否不曾在前面出现,只要出现一次就是1.
  20.                 }
  21.                 if(!flag)//如果是新字符flag就是0,在str2储存这个新字符。
  22.                 {        str2[k++]=str1[i];
  23.                         space2=k;
  24.                 }
  25.                 space1=++i;
  26.         }
  27.         str1[space1]='\0';
  28.         str2[space2]='\0';
  29.        
  30.         for(j=0;j<k;j++);//用str2中的每个字符与str1中的每个字符相减
  31.         {
  32.                 temp=0;
  33.                 for(r=0;r<i;r++)
  34.                 {
  35.                         if(!(str2[j]-str1[r]))
  36.                         {temp++;}//如果差是0 就往上加一个
  37.                 }
  38.                 if(temp>count)//但是count只记录重复数temp最大的值 只输出重复数最大的元素
  39.                 {
  40.                         count=temp; max=j;
  41.                 }
  42.         }

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

  46.         return 0;

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

使用道具 举报

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

使用道具 举报

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

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

  10.         char table[128] = {0};
  11.         for(int i = 0; i < len; ++i)
  12.                 ++table[buf[i]];
  13.        
  14.         int count = 0;
  15.         for(int i = 0; i < 128; ++i)
  16.         {
  17.                 if(table[i])
  18.                         ++count;
  19.         }
  20.         printf("你总共输入了%d个字符,其中不同的字符个数有%d个.\n", len, count);
  21.         printf("它们是: ");
  22.         for(int i = 0; i < 128; ++i)
  23.         {
  24.                 if(table[i])
  25.                         putchar(i);
  26.         }
  27.         printf("\n");

  28.         int max = 0;
  29.         char ch = 0;
  30.         for(int i = 0; i < 128; ++i)
  31.         {
  32.                 if(table[i] > max)
  33.                 {
  34.                         max = table[i];
  35.                         ch = i;
  36.                 }
  37.         }
  38.         printf("出现最多的字符是'%c',它总共出现了%d次\n", ch, max);
  39.         return 0;
  40. }
复制代码

评分

参与人数 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-4-26 12:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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