在哪里定义scanf_s()缓冲区?

时间:2018-06-27 11:30:33

标签: c scanf tr24731

如果我无法访问互联网,但是知道我想使用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"之类的占位符,但第二个参数没有任何意义-用于存储扫描结果的缓冲区的内存地址。

1 个答案:

答案 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?