谁会留下换行符?

来源:互联网 发布:linux找不到mysql命令 编辑:程序博客网 时间:2024/06/05 06:09

前几天在做课程设计的过程中,碰到一个小问题,有关于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

结论6:fgets()如果输入的字符串长度大于第二个参数给定的长度-1,则换行符不会被读取,而是留在缓冲区中。

总结:scanf() 以及getchar()再读入成功后再按下回车均会将换行留在缓冲区,gets()将会丢弃缓冲区中的换行,fgets会尽力读取缓冲区中的换行,无能为力时,回车会被留在缓冲区

原创粉丝点击