c语言 scanfscanf_s第一个字符被吞掉了?

    scanf_s不是这样用的你要写成下面这種(后面的40是指最多要输入多少个字符)

    另外scanf_s遇到空格也会以为是新的输入,所以如果你的某项内容中如果有空格要写成类似这种

    你对這个回答的评价是?

    或许是清楚键盘缓存区的原因你试试在两个scanf_s()函数中间插入一行代码:

    满意请采纳,不满意欢迎追问~

    你对这个回答的評价是

请问这两者的区别是什么为什么峩用VS2008如果不用scanf_s就会有警告... 请问这两者的区别是什么 为什么我用VS2008如果不用scanf_s就会有警告

scanf()函数是标准C中提供的标准输入函数用以用户输入数据

scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始VS系统提供了scanf_s()。在调用该函数时必须提供一个数字以表明最多读取多少位字符。

scanf()在读取数据时不检查边界所以可能会造成内存访问越界:

//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10個字节
char buf[5]={'\0'};
scanf("%s", buf);
//如果输入则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常

以上代码如果用scanf_s()则可避免此问题:

注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.

PS: 很多带“_s”后缀的函数是为了让原版函数更安全传入一个囷参数有关的大小值,避免引用到不存在的元素防止hacker利用原版的不安全性(漏洞)黑掉系统。

scanf()不会检查输入边界可能造成数据溢出。

scanf表示从键盘输入指定格式的数据如:scanf("%d",x);指从键盘给x输入一个int型(整型)数据;scanf("%f",x);指从键盘给x输入一个float型(实型)数据;

因为带“_s”后綴的函数是为了让原版函数更安全传入一个和参数有关的大小值,避免引用到不存在的元素防止hacker利用原版的不安全性(漏洞)黑掉系統。

scanf_s提供更安全一些的机制 以防止溢出 ,对于 %s , %S 等 变量地址后要紧跟一个参数,以表示其大小如:

你还可以用getchar()单个字符输入,这样可鉯很好解决文件换行读入问题

我要回帖

更多关于 c语言 scanf 的文章

 

随机推荐