繁体   English   中英

scanf_s函数的标题

[英]Header for scanf_s function

在回答问题时,我在Ideone上编译了代码并收到此错误

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

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 2008Microsoft .NET 2010

在这里和 这里,您找到了有关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);

缓冲区大小包括终止null。 宽度规范字段可用于确保读入的令牌将适合缓冲区。 如果未使用宽度指定字段,并且令牌读取太大而无法放入缓冲区,则不会将任何内容写入该缓冲区。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM