之前一直搞不明白在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’。
对自己说:出来混,总是要还的,避开不如拿开
时间: 2024-12-16 04:04:31