前几天在做课程设计的过程中,碰到一个小问题,有关于C语言几种标准输入的处理机制,做了如下测试。
1.scanf()的%c
#include<stdio.h>
int main(){
char a,b;
scanf("%c",&a);
scanf("%c",&b);
printf("%d %d\n",a,b);
}
输入 a 回车
输出 97 10
结论1: scanf的%c读取一个字符 然后本次按下的回车会留在缓冲区,可以被接下来的带%c参数的scanf或者getchar接收。附:getchar()等价于scanf(“%c”)
2.scanf()的%d
#include<stdio.h>
int main(){
int b;
char a,c,d;
scanf("%c",&a);
scanf("%d",&b);
scanf("%c",&c);
scanf("%c",&d);
printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
输入 a 回车 100 回车 c 回车
输出 97 100 10 99
结论2: scanf的%d参数 在读取之前会清空缓冲区 读取完后缓冲也会留下回车
3.scanf()的%s
#include<stdio.h>
int main(){
int i;
char a,b[10],c;
scanf("%c",&a);
scanf("%s",b);
scanf("%c",&c);
printf("%d %s\n",a,b,c);
}
输入 a 回车 str 回车
输出 97 str 10
结论3: scanf的%s参数会在读取前清空缓冲区 读取完后缓冲区会遗留最后按下的回车
4.gets()
#include<stdio.h>
#include<string.h>
int main(){
char a[10],b;
gets(a);
b=getchar();
printf("a=%s b=%d\n",a,b);
printf("%d",a[strlen(a)-1]);
//输出字符串a中最后一个字符
}
输入: str 回车 a
输出: a=str b=97 换行 0
结论4:gets()函数在按下回车后将会丢弃缓冲区中的换行符
5.fgets()
#include<stdio.h>
#include<string.h>
int main(){
char a[10],b;
fgets(a,10,stdin);
b=getchar();
printf("a=%s b=%d\n",a,b);
printf("%d\n",a[strlen(a)-1]);
}
输入: str 回车 a
输出: a=str 换行 b=97 换行 10
结论5:fgets()函数在按下回车后结束并且会读取掉缓冲区中的换行符
输入: 012345678 回车
输出: a=012345678 b=10 换行 56