scanf_s函数的标头

时间:2013-09-16 20:25:14

标签: c header-files c11 tr24731 implicit-declaration

在回答this问题时,我在Ideone上编译了代码并出现了此错误

implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration]

stdio.h的标题不是scanf_s吗?

1 个答案:

答案 0 :(得分: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 2008 Microsoft .NET 2010

Here and Here You found Interesting info about scanf_s

int scanf_s(
   const char *format [,
   argument]... 
);

根据MSDN的帮助:

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

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

char s[10];

scanf_s("%9s", s, 10);

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

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

char c;

scanf_s("%c", &c, 1);  

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

char c[4];

scanf_s("%4c", &c, 4); // not null terminated