杭电ACM 2000 ASCII码排序,getchar()函数读取输入缓冲区字符

    技术2022-07-10  128

    Hdu 2000 ASCII码排序

    题目

    Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。

    Input 输入数据有多组,每组占一行,有三个字符组成,之间无空格。

    Output 对于每组输入数据,输出一行,字符中间用一个空格分开

    Sample Input qwe asd zxc

    Sample Output e q w a d s c x z

    分析

    这道题是一道比较简单的排序题目,有三个需要注意的地方: ① scanf()输入函数输入的字符会将其保存在缓冲区中,也包括了“\n”回车符,所以这道题目中 如果采用scanf()输入a,b,c三个字符时,缓冲区其实保存了a,b,c和\n四个字符,在下一次输入测试实例时,\n会被当做第一个字符进行计算,所以导致错误。 解决方法:可以使用getchar()函数将\n读取掉,也可以直接使用字符串数组进行接收字符。 ② 在C语言中,字符可以直接用来进行比较,比较的是字符对应的ASCII编码 ③比较a,b,c,先比较a,b,如果a>b,互换值,再比较a,c,如果a>c,互换值,此时a已经最小的值了,所以只需要再比较一下b,c即可

    代码如下

    #include <stdio.h> int main() { char a,b,c; char str[3]; int i,temp=0; while(scanf("%s", str) != EOF) { a = str[0]; b = str[1]; c = str[2]; if(a>b) { //a,b换 temp=a; a=b; b=temp; } if(a>=c) { //在a<b的基础上,如果a还大于c,那 a就是最小的 temp=c; c=b; b=temp; temp=b; b=a; a=temp; } if(b>c) { //此时a的值已经是最小的,比较bc temp=c; c=b; b=temp; } printf("%c %c %c\n",a,b,c); } return 0; }

    优化

    #include <stdio.h> int main() { char a,b,c,d,x,y,z; while(scanf("%c%c%c%c",&a,&b,&c,&d) != EOF) { x=a<b?a:b; x=x<c?x:c; z=a>b?a:b; z=z>c?z:c; y=a+b+c-x-z; printf("%c %c %c\n",x,y,z); } }
    Processed: 0.009, SQL: 9