C语言知识点二十一: 缓冲区

缓冲区:

1.无缓冲(直接)输入:用户输入字符后立即重复打印该字符。

2.缓冲输入 : 大部分系统在用户按下Enter键之前不会重复打印刚输入的字符。

用户输入的字符被收集并储存在一个被称为缓冲区(buffer)的临时存储区,按下Eenter键后,程序才可使用用户输入的字符。

3.为什么要有缓冲区?

No.1: 把若干字符作为一个块进行传输比逐个发送这些字符节约时间;

No.2: 如果用户打错字符,可以直接通过键盘修正错误。

4. 虽然缓冲输入好处很多,但是某些交互式程序也需要无缓冲输入。例如,在游戏中,你希望按下一个键就执行相应的指令。因此,缓冲输入和无缓冲输入都有用武之地。

5.完全缓冲:当缓冲区被填满是才刷新缓冲区(内容被发送至目的地),通常出现在文件输入中。缓冲区的大小取决于系统,常见的大小是512字节和4096字节。

6.行缓冲: 出现换行符时刷新缓冲区。键盘输入通常是行缓冲输入,所以按下Enter键后才刷新缓冲区。

7.ANSI C和后续的C标准都是规定输入是缓冲的。

8.ANSI 没有提供调用无缓冲输入的标准方式, 这就意味着是否能进行无缓冲输入取决于计算机系统。

9. 许多IBM PC兼容机的编译器都为支持无缓冲输入提供一系列特殊的函数,其原型都在conio.h头文件中。

这些函数包括用于回显无缓冲输入的getche()函数和用于无回显无缓存输入的getch()函数。

请看以下三个函数的区别:

getchar(),getch(),getche():

第一行是手动输入的,第二行是printf输出的。

 

getch()和getche()这两个函数使用时要包含conio.h头文件:

getch()函数,也是接收键盘输入的一个字符,但不用回车确认!

 

getche函数,同样接收一个字符,不需要回车确认!但输入时明文显示(回显)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言缓冲区溢出是指当向一个固定长度的缓冲区中写入超过其容量的数据时,超出部分的数据会溢出至其他内存区域,可能导致数据损坏或系统崩溃。下面我将以一个简单的代码示例来说明。 ```c #include <stdio.h> #include <string.h> int main() { char buffer[10]; char password[10] = "password"; printf("请输入密码:"); scanf("%s", buffer); if (strcmp(buffer, password) == 0) { printf("密码正确!\n"); } else { printf("密码错误!\n"); } return 0; } ``` 在这个示例代码中,我们定义了一个长度为10的缓冲区`buffer`,用户输入的密码通过`scanf`函数读取到这个缓冲区中。然后我们将输入的密码与预设的密码比较,如果相等则输出密码正确,否则输出密码错误。 然而,该程序存在缓冲区溢出的风险。当用户输入的密码超过10个字符时,比如输入"1234567890A",会导致超出缓冲区容量。由于C语言中的字符串没有固定长度,导致缓冲区以外的数据被覆盖,可能引发不可预料的结果。 例如,如果我们输入"1234567890A",则在比较密码时由于缓冲区溢出,会将替换缓冲区后面的内存中存放的数据一同比较,可能会错误地判断密码正确。这是因为字符串以空字符`\0`结尾,而`password`的长度是10,如果输入的密码长度超过10时,\0将被覆盖,导致`strcmp`函数无法正确判断字符串是否相等。 因此,缓冲区溢出是一个常见的安全漏洞,会导致代码执行异常甚至系统崩溃。为了避免此类问题,我们在编写程序时应该特别注意缓冲区的大小,并且使用安全的字符串处理函数来防止缓冲区溢出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值