用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。

猜你喜欢

转载自blog.csdn.net/cwindyc/article/details/107007559