【问题标题】:Header for scanf_s functionscanf_s 函数的标头
【发布时间】:2013-09-21 02:42:59
【问题描述】:

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

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

stdio.h 不是 scanf_s 的标头吗?

【问题讨论】:

  • 好像在这个code here
  • 您正在编译的 platform 需要支持才能使用它(显然)。按理说你使用的东西 not 有说支持。
  • scanf_s 不是非标准的微软主义吗?

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


【解决方案1】:

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

Here andHere 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

【讨论】:

  • 从技术上讲,它是 C11 的一个可选功能,在附件 K 中定义,并通过定义 __STDC_WANT_LIBC_EXT1__ 启用(仅当实现定义 __STDC_LIBC_EXT1__ 时才可用)。实际上,您是对的,Microsoft 是唯一可用这些功能的平台(并且可能也不需要各种定义)。请参阅Do you use the TR 24731 'safe' functions? 了解更多信息。
  • 字符 c[4]; scanf_s("%4c", &c, 4); // 非空终止 ===> 不应该 &c -> c ??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多