【重读《C和指针》】笔记1

Chapter 1

函数:

scanf
getchar
get
strlen
strncpy

概念:

清空输入缓冲器 [1]

缓冲区的作用
在计算机里应用程序调用一个系统调用从用户态进去内核态再将结果回到用户态开销较大。如果我们调用printf函数,每次输出一个字符都要从用户态切换到内核态,那么连续输出多个字符开销成本将会非常大,这个时候缓存就起到非常大的作用了,输出的字符串先在应用程序里缓存起来,缓存到一定数量后再调用系统调用一次性将缓存数据输出到标准输出。由于只调用了一次系统调用,比连续调用多个系统调用性能高上不少。在生活中我们也能感受到缓存带来的效率提升,打个比方你办公室有一个垃圾桶,楼下有倒垃圾的地点,如果扔一个垃圾到垃圾桶里我们就拿去倒掉,将会在办公室和楼下之间来回很多趟,浪费大量时间。如果将垃圾桶装满,再一次性拿到楼下倒掉,只需要跑一次就能把垃圾全都倒掉,节省了时间,提高了效率。

如何清空缓冲区:
fflush并非标准库函数,gcc并不支持,建议使用以下代码实现

int ch;
while(((ch = getchar()) != EOF) && (ch != '\n')) {
	;
}

缓冲模式

  • 行缓冲模式:填满缓冲区或者有换行符’\n’或者调用fflush函数强制刷新缓冲区会立即输出
  • 全缓冲模式:填满缓冲区或者调用fflush函数强制刷新缓冲区会立即输出
  • 无缓冲模式:写入什么数据就会立即输出什么数据,例如标准错误输出默认的缓冲模式。

设置缓冲模式会用到setvbuf函数

setvbuf(stdout, NULL, _IONBF, 0); //标准输出设置为无缓冲,不使用外部缓冲区
setvbuf(stdout, NULL, _IOLBF, 0); //标准输出设置为行缓冲模式,不使用外部缓冲区
setvbuf(stdout, NULL, _IOFBF, 0); //标准输出设置为全缓冲模式,不使用外部缓冲区

scanf和gets的区别

不同:前者不支持空格,回车,TAB等,会认为输入结束,后者则不会
相同:会在接收完之后在最后添 '\n'

参考资料:

[1] C语言入门基础之缓冲区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值