欢迎光临散文网 会员登陆 & 注册

C语言scanf函数的使用心得

2021-10-07 21:52 作者:秋名山西  | 我要投稿

在今天的c语言学习中,在对scanf函数的使用上,发现了一个知识盲区,在此加以记录,以便日后查看。

scanf函数属于阻塞型函数,倘若你输入的数据个数不满足要求,则会一直阻塞,直到键盘输入足够的数据为止。用户通过键盘输入的内容会被存储在键盘输入缓冲区,scanf函数会根据自身格式控制字符(例如%d、%c等)取出键盘输入缓冲区中符合要求的数据,并将对应的为止置零。倘若读取到不符合要求的数据,会将其保留原样。只要输入缓冲区中还有数据,scanf函数就不会要求键盘继续输入数据。例如如下代码:

当我们输入五个整形数据时,程序能够正常输出键盘输入的数据。但是当我们输入:

12 b 31 56 b,对应的输出为:

返回值为1

返回值为0

返回值为0

返回值为0

返回值为0

您刚刚输入的是:12

您刚刚输入的是:0

您刚刚输入的是:0

您刚刚输入的是:0

您刚刚输入的是:0

,可以看出,输出结果是不对的,这是什么原因呢?由输出结果我们可以看出,程序在将输入的第一个数据成功赋值后,后面全部赋值失败。这是因为,当scanf函数成功读取第一个数据后,开始去读第二个数据,发现第二个数据b并不符合十进制数的要求,便将其放回原位,scanf函数返回0,提示读取失败。然后后面执行的scanf函数再一次扫描键盘输入缓冲区,并自动忽略空格,再一次来到了b这里,又发现b不是十进制数据,返回0告警。后续执行scanf函数,只要其格式控制字符不改变,这里的b注定就会是scanf函数的伤心岭,难以逾越,也就导致了除以个数据外,其他数据均读取失败。

但是,当你输入12 - + 65 78时,结果却是:

返回值为1

返回值为0

返回值为0

返回值为1

返回值为1

您刚刚输入的是:12

您刚刚输入的是:0

您刚刚输入的是:0

您刚刚输入的是:65

您刚刚输入的是:78

这里和上一次输入的数据有什么不同呢?区别就是这次输入的数据可以使十进制数或者是十进制数组成的一部分,主要就是-、+,这两个符号,其可以是有符号十进制数的组成部分,例如-10,或者+10,因此这里的scanf函数能够成功将其取走,而不会像上一个例子那样,导致后续执行的scanf函数读取数据失败。

在scanf函数的格式控制字符中,只有%c会将空格一并读取并输出,其他控制字符也会读取空格,但均会自动忽略空格、tab和回车键。scanf读取数据时,会从遇到的第一个非空格字符开始,到遇到的第一个空格结束,将两者之间的数据视为一个按规定格式读取到的数据,并存储在传入的内存地址中。

C语言scanf函数的使用心得的评论 (共 条)

分享到微博请遵守国家法律