首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

指针4-第十三课

拖更了好几天,在这里向大家道个歉。。。有时候银行看上去下班很早,其实因为核心升级,10月份赶着上线,技术部门最近一直加班呢。。。有朋友说你可以周末多写几篇囤稿啊!事实上小周的周末我也是要上班的。。。

最近一直没有案件发生,我看着福尔摩斯,他就像一朵发霉的蘑菇,种在他的靠背沙发上。

福尔摩斯看似漫不经心地浏览着报纸,露出一脸同情文章作者水平的表情。接着他的视线停留在报纸上的一个代码栏目:

(scanf()总共会读取39个字符,以及字符串终结符\0)

“华生,你已经知道了怎样让用户从键盘输入字符串,我们可以用scanf()函数,那你了解scanf()的工作原理吗?”福尔摩斯打破了沉默。

“scanf()接收一个char类型的指针,而在这里,传给了它一个字符数组变量。。。”我突然发现一个问题,并陷入了沉思。

“很好,我知道你一定在想为什么scanf()要接收指针,”福尔摩斯接下来说的话,在我今后的学习中派上了很大的用场,“这是因为scanf()函数打算更新数组的内容,一个想要更新变量的函数可不需要变量本身的值,它要的只是变量的地址。

“华生,你快来看看这篇文章。”福尔摩斯将报纸轻扔到到我面前的桌上,然后转过身去,看着窗外。我接过报纸往下看。

这篇文章接下来提到了,scanf()输入整型数值:

(%i表示用户会输入一个int值,%d也可以;用&运算符得到age的地址)

还有scanf()一次输入多条信息的情况:

(读取间隔是一个空格,也可以是其它的,这句话需要你自己寻味一下)

文章到这里就结束了,我觉得这篇文章的栗子挺好的。

我耸耸肩,表示赞同他说的后者,此公众号的作者水平确实低,而且还喜欢拖更。我将柜子上的笔和墨水递给福尔摩斯,福尔摩斯在纸上快速地写了起来。

写完之后他看着我,说到:“简单来说,scanf()函数有一个小毛病。因为scanf()和printf()用的是一样的格式说明,很多人使用时习惯只用%s。”

“像这种情况,如果忘了限制scanf()读取字符串的长度,用户就可以输入远远超出程序空间的数据,多余的数据会写到计算机还没有分配好的存储器中。如果运气好,数据不但能保存,而且不会有任何问题。但缓冲区溢出很可能会导致程序出错。”

福尔摩斯点了根雪茄,烟雾慢慢的弥漫开来。“所以,提到scanf()就必须提到fgets(),和scanf()函数一样,fgets()接收char指针,不同的是,你必须给出最大长度。”

(第一个参数:指针或者数组变量;第二个参数:接收字符串(包括“\0”)的最大长度;第三个参数:stdin表示数据来自键盘。)

(之后我们会见到输入不止来自于键盘的情况。)

“也就是说当调用fgets()时不可能一不小心忘记设置长度,因为他就出现在函数声明中,所以不得不加这个参数。”

“还有一点值得一提的是,上面这段代码中,food是数组变量,所以sizeof返回了数组的大小;如果food是指针变量,sizeof仅仅会返回指针的大小。接下来我们会慢慢体会到数组变量和指针变量的不同

福尔摩斯最后的一段话,听的我有点迷糊,加之现在室内已经是烟雾缭绕,困意顿时上脑,我趴在桌子上沉沉地睡去。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180720G0LSZN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券