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

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);
       }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值