在回答this问题时,我在Ideone上编译了代码并出现了此错误
implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration]
stdio.h
的标题不是scanf_s
吗?
答案 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