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