scanf_s函数的头文件

6

在回答这个问题时,我在Ideone上编译了代码,但是出现了以下错误:

implicit declaration of functionscanf_s[-Wimplicit-function-declaration]

stdio.h不是scanf_s的头文件吗?”

2
似乎在这个代码里 - smac89
你正在编译的平台需要在使用之前支持它(显然)。很明显你所使用的并没有这种支持。 - WhozCraig
1
scanf_s 不是微软的非标准用法吗? - Paul R
1个回答

10

scanf_s 是微软专用的。它的头文件是stdio.h,但在GCC中不存在。

用于从标准输入流中读取格式化数据。这些版本的scanf,scanf_s,_scanf_l,wscanf,_wscanf_l都有安全增强功能。

Ideone使用GCC,因此你只会得到undefined reference to scanf_s的错误信息。

大多数情况下,你可以在基于Windows的编译器中找到这个函数,比如
Visual Studio 2008Microsoft .NET 2010

在这里和这里,你可以找到关于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

8
从技术上讲,这是 C11 的可选功能,定义在附录 K 中,通过定义“__STDC_WANT_LIBC_EXT1__”来启用(仅当实现定义了“__STDC_LIBC_EXT1__”时才可用)。在实践中,你的观点是正确的,Microsoft 是唯一一个具有这些函数的平台(而且可能不需要各种定义)。有关更多信息,请参见“Do you use the TR 24731 'safe' functions?”(https://dev59.com/73RC5IYBdhLWcg3wOOP1)。 - Jonathan Leffler
1
char c[4];scanf_s("%4c", c, 4); // 没有空字符终止符===> 不应该是 &c -> c 吗? - kwagjj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接