码迷,mamicode.com
首页 > 其他好文 > 详细

sacnf_s()函数小记

时间:2015-10-24 17:21:09      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

之前一直搞不明白在Visual Stdio2013上为什么C程序的scanf()函数总会被报错,但是程序复制到其他编译器上又是正确的。所以在用vs编C程序时,一直机械地按照它提醒的用scanf_s()来替换scanf()函数,虽然不知道为什么,但也没有出现问题。知道今天,当我要读入一个字符串时,如下:

#include <stdio.h>
#include <string.h>
int main(void)
{
     char str[100];
     scanf_s("%s", str);
     printf("%d %s", strlen(str), str);
     return 0;
}

结果确输出:0

我第一反应就是scanf_s()函数和scanf()看来并不完全等同(这不是废话,至少在没出现问题前,我一直都是直接用scanf()的语法直接套在scanf_s()上的),所以我就搜索了一下,结果如下:This function is specific to Microsoft compilers. It is the same as scanf, except it does not cause buffer overload.  It takes the input in a text based console program and places it into a variable. –from here

原来它是微软的编译器专用的,如vc++,vs(vs在2013以后才支持),因为scanf()函数输入时不检查下标,如果输入的字符串长度大于声明的长度,可能就会写到其他内存中去,造成未知错误,而scanf_s()函数基于scanf()做了改进,输入字符串时会增加一个限定长度的参数,如上面代码可改为:scanf_s("%s", str, 100), 这样即使输入超限了,程序也只会读取前99个字符然后再加一个‘0’。

对自己说:出来混,总是要还的,避开不如拿开

sacnf_s()函数小记

标签:

原文地址:http://www.cnblogs.com/fly1222/p/4907143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!