scanf(),getch(),getchar(),gets(),printf()关于缓冲区的理解

本文深入探讨了C语言中的常用输入输出函数,如scanf、printf、getch、getchar及gets的功能与区别,详细解析了它们与标准输入输出缓冲区的关系,以及在不同场景下的应用技巧。

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

这三个函数是常用的输入输出函数,而且他们都与键盘缓冲区密切相关。
为了了解他们之间的关系,那么首先要知道他们各自的作用
scanf()函数
printf()函数
getch()函数
getchar()函数
gets()函数
C语言标准输入输出缓冲区

标准输入stdin
标准输出stdon

scanf()函数

控制字符就不一一谈论了。

scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数.
scanf()的返回值是成功赋值的变量数量。

scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;
如果a和b都未被成功读入,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。

按键盘上的回车产生了2个字符:回车符(’/r’)和换行符(’/n’)。回车符’/r’(CR:carriage return:倒车)使光标回到这行的首部,换行符(’/n’)(new line)然后再换行。

所以在两个scanf函数连续使用时,会影响第二个scanf函数的正常输入,所以可以在中间加一个getchar()将缓冲中的\n读取出来,让缓冲区清空

scanf和gets在输入字符串的区别:scanf是以回车作为键盘输入的结束,但是它对字符串的输入的结束却是以空格、回车、Tab结束,此外从键盘输入后,系统会自动在最后添加结束标志符 ‘\0’,并且最后敲回车时会把\n也存到缓冲中,如果不想要这个缓冲,则需要getchar()手动提取\n这个字符

printf()函数

printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中.

控制字符也不一一例举了,需要知道的是
一个位于一个%和格式化命令间的整数担当着一个最小字段宽度说明符,并且加上足够多的空格或0使输出足够长. 如果你想填充0,在最小字段宽度说明符前放置0. 你可以使用一个精度修饰符,它可以根据使用的格式代码而有不同的含义.

用%e, %E和 %f,精度修饰符让你指定想要的小数位数. 例如,
%12.6f
将会至少显示12位数字,并带有6位小数的浮点数.
printf()的返回值是打印的字符数,如果发生错误则返回一个负值.

int x=1;
printf("%d\n",x);
char s[]="asd";
printf("%s\n",s);

上面两个printf函数的返回值分别是2 和 4
在这里printf的函数返回输出的内容的字符数,包括换行符等功能符号

getch()函数

所在头文件:<conio.h>
函数用途:从控制台读取一个字符,但不显示在屏幕上
当用户按下某个字符时,函数自动读取,无需按回车
用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。(当我们希望程序在执行的过程中输入字符而不影响程序的顺序进行时,一般在getch函数外套一个 kbhit()函数,该函数用于检测是否有键盘输入
getch 没有缓冲区,也就是说,输入一个字符就立即读取。
3.在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)
1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。
2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。

getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。

getchar()函数

此处引用
小猫恨鱼的解释,十分值得学习。

头文件#include <stdio.h>
getchar() 函数的特点是:如果缓冲区中没有内容,那么等待用户输入;如果有内容,哪怕一个字符,也会直接从缓冲区中读取数据,不会等待用户输入。
第一次调用 getchar() 时,会等待用户输入,用户输入的所有字符都被放到标准输入(stdin)缓冲区,直到用户按下回车键为止(回车符也被放入缓冲区) ,getchar()函数等待输入直到按回车才结束(前提是缓冲区没有数据),回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。

例题:第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。

#include<stdio.h>

#include<conio.h>

void main()

{

    char c;

    while ((c=getchar())!='/n')    /*每个getchar()依次读入一个字符*/

        printf("%c",c);        /*按照原样输出*/

    printf("/n/n");

}

程序运行时,首先停下来,等你输入一串字符串,输入完毕后,它把你输入的整个字符串都输出来了,咦,你不是说getchar()只返回第一个字符么,这里怎么?
  因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了
  
  按键盘上的回车产生了2个字符:回车符(’/r’)和换行符(’/n’)。回车符’/r’(CR:carriage return:倒车)使光标回到这行的首部,换行符(’/n’)(new line)然后再换行。

所以当输入字符'w',并按下回车键以后。首先得到回车符。那个getchar函数结束了。 但是还存在一个换行符。所以如果用getchar()来做判断的时候。最好再写一次getchar()清除缓冲区的'/n'.

如何清空输入缓冲区的内容?
对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它

char sbuf[1024];
// ...
fgets( sbuf, 1024, stdin );

gets()函数

头文件:#include<stdio.h>
gets()用来从标准设备读入字符并存到参数s所指的内存空间, 直到出现换行字符或读到文件尾为止, 最后加上NULL作为字符串结束。
gets()若成功则返回s指针, 返回NULL则表示有错误发生。
由于gets()无法知道字符串s的大小, 必须遇到换行字符或文件尾才会结束输入, 因此容易造成缓冲溢出的安全性问题。建议使用fgets()取代。

gets函数是直到出现换行字符或读到文件尾为止, 最后加上NULL作为字符串结束也就是\0为结束符
并且方便在字符串中间的空格之类的字符输入。使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,
然后丢弃,所以缓冲区中不会遗留换行符。

C语言标准输入输出缓冲区

C语言的标准输入输出是分缓冲和无缓冲的。这里面缓冲分为全缓冲和行缓冲。
注意:Windows下的输出设备没有缓冲区,意思是printf是无缓冲的
全缓冲: 全缓冲是指当缓冲区满了才进行 I/O 的读写操作。一般磁盘文件是全缓冲的(缓冲区一般为4096个字节)。
行缓冲: 行缓冲是指遇到换行符(即’\n’)后进行 I/O 操作,当然缓冲区满了也要进行操作。注意:换行符也被读入缓冲区。(缓冲区一般为1024个字节)
一般地,标准输入stdin和标准输出stdout为行缓冲,标准错误输出stderr无缓冲。
1、不管是行缓冲还是全缓冲,缓冲区满时会自动刷新

2、行缓冲遇到换行符\n时会刷新

3、关闭文件时会刷新缓冲区

4、程序关闭时一般也会刷新缓冲区,这个是由标准库来保障的

5、使用特定的函数也可以手动刷新缓冲区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值