如果我无法访问互联网,但是知道我想使用scanf_s()
函数来从键盘(stdin
)接收输入,我怎么知道在哪里声明缓冲?
此刻,当我进入Visual Studio中的scanf_s()
函数时,会看到以下内容:
#if __STDC_WANT_SECURE_LIB__
_Check_return_opt_
_CRT_STDIO_INLINE int __CRTDECL scanf_s(
_In_z_ _Scanf_s_format_string_ char const* const _Format,
...)
#if defined _NO_CRT_STDIO_INLINE // SCANF
;
因此,我看到scanf_s()
接受了1个定义的参数(char const * _Format
),在这种情况下,该参数可能是"%s"
之类的占位符,但第二个参数没有任何意义-用于存储扫描结果的缓冲区的内存地址。
答案 0 :(得分:1)
scanf_s
包含可变的参数列表。第一个参数是强制性的,是具有转换规范的字符串,以下参数取决于格式字符串中存在的转换规范。
对于每个转换规范%s
,%c
和%[
,scanf_s
期望有2个转换参数:指向char
({{1} })和一个通过类型char *
传递的数字,该数字指定rsize_t
参数指向的数组的大小。
这里是一个例子:
char *
但是请注意,对#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
int main() {
char buf[32];
int res;
printf("Type a word: ");
res = scanf_s("%s", buf, sizeof(buf));
switch (res) {
case EOF:
printf("Input failure\n");
break;
case 0:
printf("Matching failure\n");
break;
case 1:
printf("Success: you typed '%s'\n", buf);
break;
default:
printf("Unexpected return value %d\n", res);
break;
}
return 0;
}
的支持远非普遍。 Microsoft平台通常支持它,但是具有不同的语义,而Linux和Mac C库通常不支持。阅读此问题以了解Why didn't gcc implement _s functions?