看到这个题目首先我们要捕捉一些信息,看什么是关键点,下面我列举几个重要的关键点:
1.输入含空格的字符串
一般我们的习惯就可能使用scanf()来输入,但是要注意的是此题含有空格,scanf()遇到空格就会结束,所以,在这一题上我们选择比scanf()更好处理空格的gets()函数, 因为gets()函数是遇到回车返回,遇到空格还是会读入。
2.多组输入
谈到多组输入,也可以分成scanf()和gets()函数,本题用的是gets()函数,但是由于scanf()函数在平常练习中可能使用的多,所以这里也说明一下。
1.scanf()函数:
一般我们用以下代码表示scanf()的多组输入
while (~scanf("%d",&a)){
}
scanf()函数里面的数据类型依据需求决定,那么为什么这一段代码可以用作scanf()函数的多组输入呢?
‘~’ 为一元运算符,用于求整数的二进制反码,也就是对输入的数的二进制进行按位取反。通过上面我们可以知道scanf() 的返回值都为为大于等于 -1 的数,只有当 scanf 返回值为 -1(二进制表示为全为 1)时,~scanf() 的值为就为 0,其他情况均不为 0。
2.gets()函数:
其实gets()函数的多组输出和scanf()类似,一般为一下代码:
while(gets(a)){
}
但是它们也有不同之处,那就是返回值类型不一样:
实际上gets()有两种可能的返回值类型:
1)当程序正常输入字符串时:返回读入字符串的地址,也就是字符串存放的数组的首地址;
2)当程序出现错误或者遇到文件结尾时:返回空指针NULL
3.统计每一个字符出现的次数
一般遇到这种统计什么出现的次数,其实都是可以用一个计数数组来计数,比如以下代码:
char a[1000];
int count[1000]={0};
for(int i=0;a[i];i++){
count[a[i]]++;
}
该代码只是当作演示,因为还没有进行输入,详细的请看代码及注释;
a[i]是字符数组,最后一项是结束符'/0'所以可以作为控制循环的条件,意思就是把所有字符的出现次数存入count[1000]这个计数数组然后计数数组count[索引]中的索引就是代表该字符,该计数数组的值代表出现的次数,初期的基本思路就这些,详细的请看下文的代码以及注释解释:
代码以及注释解释:
#include<stdio.h>
int main(){
char a[1000];//定义一个字符数组用来存储字符串
while(gets(a)){//满足题目要求的多组输入字符串,并且只能用gets(),而不能用scanf(),因为scanf()函数遇到空格会结束,所以用gets();
int count[1000]={0};//每一次重新进行多组输出的时候,计数的数组都要初始化为0不然会影响多组输入的下一次计数;
for(int i=0;a[i];i++){//因为a[i]是字符数组,其最后一个字符为'/0'结束符,所以可以作为循环判断的依据
if(a[i]==' '){
continue;//排除空格的影响
}
count[a[i]]++;//对应字母的计数每出现一次就加1,用来记录每一个字符的出现次数
}
int max=-1;
for(int j=0;a[j];j++){
if(count[a[j]]>max){//通过定义一个max与所有字符出现的次数进行比较,从而来统计出现的最多次数
max=count[a[j]];
}
}
char maxchar[1000];//用来存储出现次数最多的字符
int index=0;
for(int i=0;a[i];i++){
if(count[a[i]]==max){
maxchar[index]=a[i];//用最多的次数来比较每一个字符的计数值,用来统计出现的最多字符
index++;
}
}int min=100000;
for(int i=0;i<index;i++){//根据题目要求又要从出现次数最多的字符里面选取ASCII码最小的字符
if(maxchar[i]<min){
min=maxchar[i];
}
}
printf("%c %d\n",min,max);//然后将出现最多的字符和出现次数输出
}
return 0;
}