用scanf读入字符串、单个字符与数字(统计出现次数最多的字符串)

//用scanf读入字符串、单个字符、数字的区别
//二位数组的降维读入,十分便捷

#include<stdio.h>
#include<string.h>
void main(){
	int n;
	while(~scanf("%d",&n)&&n){//会在缓冲区留下一个换行符
	//	getchar();不需要它的原因③
		char b[1005][20];
		int max=0,maxi,i,j,count;
		for(i=0;i<n;i++){
			scanf("%s",b[i]);//即使前面没有getchar,由于类型是字符串,不会读取前面的getchar,下面一个同理
		//	getchar();不需要它的原因③
		}
		for(i=0;i<n;i++){
			count=0;
			for(j=0;j<n;j++)
				if(strcmp(b[i],b[j])==0) count++;
			if(count>max) {max=count;maxi=i;}
		}
		printf("%s\n",b[maxi]);
	}
}

总结
//使用scanf("%c",&c)读取c(c是char类型),如果读取之前有换行符或空格,那么c就会把之前的缓冲区的换行符或空格读入,解决方法是,在这之前先getchar()一下;
//如果用scanf("%s",str)读取str(char str[]或char str[][]),哪怕缓冲区有换行符或空格,也不会读取;
//其他数值类型是没有这样的问题的。

#include<stdio.h>
#include<string.h>
void main(){
	int repeat;
	scanf("%d",&repeat);
	getchar();//用getchar()的原因①
	while(repeat--){
		char s[1000],c;
		gets(s);
		//不用加getchar()的原因②
		scanf("%c",&c);
		getchar();//用getchar()的原因①
		printf("result: ");
		for(int i=0;i<strlen(s);i++){
			if(s[i]==c) continue;
			else printf("%c",s[i]);
		}
		printf("\n");
	}
}

总结
//接收前:③scanf("%s",s)接收字符串自动舍弃缓冲区回车符,①但是gets(s)会接收缓冲区的回车符;
//接收后:②gets(s)会舍弃用来结束输入的回车符,④scanf("%s",s)会在缓冲区留下回车符;

//scanf 以space、enter、tab结束一次输入,不会舍弃最后的结束符(残留在缓冲区);
//getchar 以enter结束输入,不会舍弃最后的结束符(残留在缓冲区);
//gets 以enter结束输入,会舍弃enter。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值