scanf_s函数的标头

hac*_*cks 2 c header-files tr24731 implicit-declaration c11

在回答这个问题时,我在Ideone上编译了代码并得到了这个错误

implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration]
Run Code Online (Sandbox Code Playgroud)

是不是stdio.h标题scanf_s

Gan*_*har 6

scanf_s是特定于Microsoft的.标题是stdio.h但不是GCC.

用于从标准输入流中读取格式化数据.这些版本的scanf,scanf_s, _scanf_l, wscanf, _wscanf_l have security enhancements

凡为 Ideone uses GCC,因为这只是你有undefined reference to scanf_s

大多数情况下,您可以在基于Windows的编译器(如
Visual Studio 2008Microsoft .NET 2010)中找到此功能

在这里和 这里您找到了有关scanf_s的有趣信息

int scanf_s(
   const char *format [,
   argument]... 
);
Run Code Online (Sandbox Code Playgroud)

根据MSDN的帮助:

scanf_s函数从标准输入流stdin读取数据,并将数据写入参数给定的位置.每个参数必须是指向与格式中的类型说明符对应的类型变量的指针.如果在重叠的字符串之间进行复制,则行为未定义.

与scanf不同,scanf_s要求为c,C,s,S或[类型]的所有输入参数指定缓冲区大小.缓冲区大小在指向缓冲区或变量的指针后立即作为附加参数传递.例如,如果读取字符串,则传递该字符串的缓冲区大小,如下所示:

char s[10];

scanf_s("%9s", s, 10);
Run Code Online (Sandbox Code Playgroud)

缓冲区大小包括终止空值.宽度指定字段可用于确保读入的令牌将适合缓冲区.如果没有使用宽度指定字段,并且令牌读取太大而无法放入缓冲区,则不会将任何内容写入该缓冲区.

In the case of characters, one may read a single character as follows:

char c;

scanf_s("%c", &c, 1);  
Run Code Online (Sandbox Code Playgroud)

读取非空终止字符串的多个字符时,整数用作宽度规范和缓冲区大小.

char c[4];

scanf_s("%4c", &c, 4); // not null terminated
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,它是C11的可选功能,在附件K中定义,并通过定义`__STDC_WANT_LIBC_EXT1__`(仅在实现定义`__STDC_LIBC_EXT1__`时可用)来启用.在实践中,您是对的,Microsoft是唯一可以使用这些功能的平台(并且可能也不需要各种定义).有关详细信息,请参阅[您是否使用TR 24731'安全'功能?](http://stackoverflow.com/questions/372980/do-you-use-the-tr-24731-safe-functions). (5认同)