c - scanf_s 函数的头文件

标签 c header-files c11 tr24731 implicit-declaration

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

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

不是stdio.hscanf_s 的标题?

最佳答案

scanf_s 是微软特有的。标题是 stdio.h但不是在海湾合作委员会。

用于从标准输入流中读取格式化数据。这些版本的 scanf,scanf_s, _scanf_l, wscanf, _wscanf_l have security enhancements
Ideone uses GCC正因为如此,你才得到undefined reference to scanf_s
大多数情况下,您可以在基于 Windows 的编译器中找到此函数,例如
Visual Studio 2008 微软 .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);

缓冲区大小包括终止空值。宽度规范字段可用于确保读入的 token 适合缓冲区。如果未使用宽度规范字段,并且读取的 token 太大而无法放入缓冲区,则不会向该缓冲区写入任何内容。
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

关于c - scanf_s 函数的头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18836661/

相关文章:

c++ - 即使使用前向声明也会出现未定义的类型错误

c - VALGRIND 无效读取大小为 8、链表、释放节点

GtkMenuItem可以有彩色标签吗

c++ - Windows 上的 strptime() 等价物?

ios - 为什么在创建项目范围的常量时需要实现文件 (.m)?

c++ - 将所有代码放在 C++ 头文件中的优点和缺点?

c - "do { free(x); x = NULL; } while (0);"和 "{ free(x); x = NULL; }"有什么区别

c - 我们应该称它为 C17 还是 C18?

c - 检测宏参数是否为类型名

c - GCC 与 C11 标准中的位字段类型