去看了一下小甲鱼的答案代码,你这段代码有一个错误,我把答案代码重新贴出来
- #include <stdio.h>
- #include <string.h>
- #define NUM 128
- int main()
- {
- int ch, i, j = 0, max = 0;
- int input_num = 0;
- int ascii[NUM] = {0};
- char count[NUM] = "";
- printf("请输入英文文本:");
- while ((ch = getchar()) != '\n')
- {
- ascii[ch]++; // 字符对应的ASCII码加1
- input_num++;
- }
- for (i = 0; i < NUM; i++)
- {
- if (ascii[i])
- {
- count[j++] = i;
- if (ascii[i] > ascii[max])
- {
- max = i;
- }
- }
- }
- printf("你总共输入了%d个字符,其中不同的字符个数有%d个。\n", input_num, strlen(count));
- printf("它们是:%s\n", count);
- printf("出现次数最多的字符是\'%c\',它总共出现了%d次。\n", max, ascii[max]);
- return 0;
- }
复制代码
首先我解释各个变量的含义和用途:
int ch, i, j = 0, max = 0; ch:输入字符的临时存储;i,j循环变量;max:存储出现次数最多的字母
int input_num = 0; 用处是统计输入字符个数
int ascii[NUM] = {0}; 用处是统计对应字符出现的次数,如ascii[97] = 5 意思是ASCII码为97的字符(‘a’)输入了5次
char count[NUM] = "";用处是存储所出现的所有字符
接下来是这段:
while ((ch = getchar()) != '\n')
{
ascii[ch]++; // 字符对应的ASCII码加1
input_num++;
}
每次读取一个字符直到读取到了换行符结束循环
循环的内容是将读到字符对应的ascii数组的值自增1
输入字符总数自增1
下面这段:
for (i = 0; i < NUM; i++)
{
if (ascii[i])
{
count[j++] = i;
if (ascii[i] > ascii[max])
{
max = i;
}
}
}
对于ascii的每一位进行遍历(因为ascii数组定义时的长度就是NUM)
如果ascii[i] 不等于 0 (ascii[i]=0意味着以i为ASCII码的字符没有输入)
那么说明出现了一个新的字符,将这个字符i存入count数组,然后把count数组的索引变量j自增1
如果字符i的个数大于数量最多的字符max的个数,那么用字符i代替max
说明此时字符个数最大的字母已经更新为i
最后的输出部分不再多说。
这个程序对新手的难点在于对ascii[]数组作用的理解
还有对C语言中的字符类型‘char’的理解
我在上面解释中使用了“字符i”、“字符max”
这一点我不知道小甲鱼前面的视频有没有说明,如果你能理解我就不说了,不能的话我再继续回复