4

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

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

不是stdio.h标题scanf_s吗?

4

1 回答 1

7

scanf_s是特定于 Microsoft 的。标头在 GCC 中,stdio.h但不在 GCC 中。

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

Ideone uses GCC正因为如此,只有你得到了 undefined reference to scanf_s

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

Here 和 Here 您找到了有关 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
于 2013-09-16T20:36:45.417 回答