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

本文探讨了C语言中scanf, fgets, fputs在处理缓冲区时的问题。通过一个示例代码展示了如何使用fgets读取用户输入,并用fputs输出。在输入'hello android hello iPhone hello android hello android '后,观察到自动换行的现象,揭示了缓冲区的工作原理及其对程序行为的影响。" 116928465,10801457,Android开发面试宝典:从初阶到高阶的技能梳理,"['Android开发', '移动开发', '面试准备', '技术进阶', '编程语言']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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),不会清空空白字符


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值