hac*_*cks 2 c header-files tr24731 implicit-declaration c11
在回答这个问题时,我在Ideone上编译了代码并得到了这个错误
implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration]
Run Code Online (Sandbox Code Playgroud)
是不是stdio.h标题scanf_s?
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)中找到此功能
int scanf_s(
const char *format [,
argument]...
);
Run Code Online (Sandbox Code Playgroud)
根据MSDN的帮助:
scanf_s函数从标准输入流stdin读取数据,并将数据写入参数给定的位置.每个参数必须是指向与格式中的类型说明符对应的类型变量的指针.如果在重叠的字符串之间进行复制,则行为未定义.
与scanf不同,scanf_s要求为c,C,s,S或[类型]的所有输入参数指定缓冲区大小.缓冲区大小在指向缓冲区或变量的指针后立即作为附加参数传递.例如,如果读取字符串,则传递该字符串的缓冲区大小,如下所示:
char s[10];
scanf_s("%9s", s, 10);
Run Code Online (Sandbox Code Playgroud)
缓冲区大小包括终止空值.宽度指定字段可用于确保读入的令牌将适合缓冲区.如果没有使用宽度指定字段,并且令牌读取太大而无法放入缓冲区,则不会将任何内容写入该缓冲区.
In the case of characters, one may read a single character as follows:
char c;
scanf_s("%c", &c, 1);
Run Code Online (Sandbox Code Playgroud)
读取非空终止字符串的多个字符时,整数用作宽度规范和缓冲区大小.
char c[4];
scanf_s("%4c", &c, 4); // not null terminated
Run Code Online (Sandbox Code Playgroud)