C语言scanf fgets,【C语言】scanf,fgets,fputs缓冲区问题

1 为什么输入回车后,程序就开始运行了?

scanf仅在每一个数据域均有数据,并按回车后结束,程序继续运行。

因为scanf函数规定:在scanf函数接收数据时,遇到以下情况之一则结束一个数据的输入,

(1) 遇到空格、回车、跳格键

(2)遇到宽度结束

(3)遇到非法输入

2 在用%d控制字符输入数据时,系统会忽略掉空白字符,

在用%c控制字符输入数据时,系统不会忽略,而会读取所有字符。

空白字符:space  tab newline

运行时按照如下方式输入三个值

int main()

{

int a ,b;

scanf("%d%d",&a,&b);

}

控制台输入:“1空格空格空格3”则系统会忽略多余的空格字符,直到两个数据域a,b都有数据并且输入了回车之后就结束了程序的输入,这时程序数据读入完毕,开始了处理过程。

而像下面这种:

int main()

{

int a ,b;

char c

scanf("%d%d%c",&a,&b,&c);

}

控制台输入:“1空格空格空格2空格m”回车后,a,b,c的值分别为a = 1,b = 2 , c = 空格

3 fgets输入字符串最后需要使用回车结束输入,这时fgets函数就读入了回车符。

所以 fgets函数得到的字符串是带有回车符的,而与之相应的fputs函数输出fgets函数得到的字符串也是带有回车换行符的。

比如:

int main(int argc, const char * argv[])

{

char data[20] = {0};

char data2[20] = {0};

fgets(data, 20, stdin);

fgets(data2, 20, stdin);

fputs(data, stdout);

fputs(data, stdout);

return 0;

}

输入为

hello android

hello iPhone

输出为:

hello android

hello android

自动换行。

补充:

代码:

student s;

fgets(s.name, 20, stdin);

scanf("%c",&s.sex);

scanf("%d%d",&s.number,&s.score);

fputs(s.name, stdout);

printf("%c\n%d\n%d\n",s.sex,s.number,s.score);

fgets函数读入了结尾的回车换行符,所以在下一个字符输入之前,缓冲区已经清空了

scanf读入字符后,也不需要getchar因为,下面的输入 %d整型会自动忽略掉之前输入字符时留下来的空白字符。

scanf(%s),不会清空空白字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值