qq_32653757 2015-11-10 16:44 采纳率: 76.9%
浏览 1965
已采纳

新手OJ一题,自认为正确, 但是wrong,恳求大神指出

Description
钟Sir是一个迷信的(superstitious)家伙。他相信每一个字符串(string)里都有一个幸运字符。我们可以通过以下方法找到这个字符。例如,在字符串abbccc中,c 出现的次数最多,所以这个幸运字符就是 c 啦!(>_<) (钟Sir的想法好简单啊…)
Input
第一行是测试数据的组数n,接下来的每组测试数据占一行,每行数据不超过1000个字符且非空。
字符串里只含小写字母。
Output
每组数据对应输出一行,包括出现次数最多的字符和该字符出现的次数,中间是一个空格。如果有多个字符出现的次数相同且最多,那么输出ASCII码最小的那一个字符。
Sample Input
2
abbccc
adfadffasdf
Sample Output
c 3
f 4


#include
int main(void){
int z[30], n, t, g, i, j, a, xia, max;
char ch;
scanf("%d", &t);
for(g=1; g<=t+1; g++){

for(i=1; i<=28; i++)
z[i]=0;//记录数组初始化

for(i=1; i<=1000; i++){
ch=getchar();
if(ch=='\n')
break;
a=ch-'a'+1;
z[a]++;
}//统计到记录数组

max=-9;
for(i=1; i<=26; i++){
if(z[i]>max)
{max=z[i]; xia=i;}
}

if(g!=1){
ch='a'+xia-1;
printf("%c ", ch);
printf("%d\n", max);
}
}
return 0;
}

  • 写回答

2条回答 默认 最新

  • baboon_chen 2015-11-11 03:38
    关注

    楼主,我帮你看了一个,主要问题是关于C语言在scanf之后,还在输入字符的问题.
    我先把改过的代码给出 :

     #include <stdio.h>
    int main(void)
    {
        int z[30], n, t, g, i, j, a, xia, max;
        char ch;
        scanf("%d", &t);
        getchar();
        for(g=1; g<=t; g++)
        {
            for(i=1; i<=28; i++)
                z[i]=0;//记录数组初始化
            for(i=1; i<=1000; i++)
            {
                ch=getchar();
                if(ch=='\n')
                    break;
                a=ch-'a'+1;
                z[a]++;
            }//统计到记录数组
            max=-9;
            for(i=1; i<=26; i++)
            {
                if(z[i]>max)
                {max=z[i]; xia=i;}
            }
            ch='a'+xia-1;
            printf("%c ", ch);
            printf("%d\n", max);
        }
        return 0;
    }
    

    这是我自己学C 输入数字,字符、回车的笔记:

    c语言中 scanf后面一定要跟个 getchar吃回车吗?
    如果后面有个scanf或者getchar()读取字符型的话就会读到回车了(输入流缓冲区会保留回车)。fflush和getchar以及相关的一些函数可以吞掉后面的回车

    #include
    int main()
    {
    char a;

    scanf("%c",&a);
    printf("你输入了%c\n",a);
    

    // fflush(stdin); 也可以用getchar()吞掉回车

    scanf("%c",&a);
    printf("你输入了%c\n",a);

    return 0;
    }

    但是为什么把%c换成%d结果就不一样了?
    %d 输入的时候,也是输入了数字+ 回车符
    这时候就看你下一条 输入语句是什么了 如果也是 %d 那么没问题
    如果下一条 是 %c那么就会读取到留在缓冲区里的 回车符号
    可以百度 搜索“ C 输数字 字符 回车 ”,看一下第二篇文章

    在scanf 之后 可以用 fflush(stdin) 清空缓冲区。
    函数名: fflush
    功 能: 清除一个流
    用 法: int fflush(FILE *stream);
    头文件

    getch()、getche()和getchar()函数
    (1) getch()和getche()函数
    这两个函数都是从键盘上读入一个字符。其调用格式为:
    getch();
    getche();
    两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche()
    函数却将读入的字符回显到显示屏幕上。
    例1:
    #include
    #include //头文件
    main()
    {
    char c, ch;
    c=getch(); /*从键盘上读入一个字符不回显送给字符变量c*/
    putchar(c); /*输出该字符*/
    ch=getche(); /*从键盘上带回显的读入一个字符送给字符变量ch*/
    putchar(ch);
    }
    利用回显和不回显的特点, 这两个函数经常用于交互输入的过程中完成暂停
    等功能。

    例2:
    #include
    main()
    {
    char c, s[20];
    printf("Name:");
    gets(s);
    printf("Press any key to continue..."); //这样不会在打印出这句话后,立即输出Press any key to continue 而是等待你输入一个不回显的回车后,再输出最后一句话。
    getch(); /*等待输入任一键*/
    }

    (2) getchar()函数

    函数名: getchar
    功 能: 从stdin流中读字符
    用 法: int getchar(void);
    头文件: #include

    getchar()函数也是从键盘上读入一个字符, 并带回显。它与前面两个函数
    的区别在于: getchar()函数等待输入直到按回车才结束, 回车前的所有输入字
    符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。

    #include

    getchar()函数的调用格式为:
    getchar();
    例3:
    #include
    #include
    main()
    {
    char c;
    c=getchar(); /*从键盘读入字符直到回车结束*/
    putchar(c); /*显示输入的第一个字符*/
    getch(); /*等待按任一健*/
    }
    例4
    #include
    #include
    main()
    {
    char c;
    while ((c=getchar())!='\n') /*每个getchar()依次读入一个字符*/
    printf("%c",c); /*按照原样输出*/
    getch(); /*等待按任一健*/
    }

    getch()等待读取键盘输入的一个字符,不显示与屏幕上

    getche()显示与屏幕上

    我想,如果看了上面的笔记应该会帮助楼主。其实楼主的算法没有问题。但是我有一些建议给楼主,在取变量名的时候,最见名知义。
    比如,用于统计的数组z[],可以用count[]代替,t可以用times(次数)代替。。 这样,往后自己回看,或者供给他人阅读,都很方便。希望对楼主有用

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大