首页 > 解决方案 > scanf_s() 缓冲区在哪里定义?

问题描述

如果我无法访问互联网,但知道我想使用该scanf_s()函数从键盘 ( stdin) 获取输入,我怎么知道在哪里声明缓冲区?

目前,当我进入scanf_s()Visual Studio 中的函数时,我看到了:

#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),在这种情况下,它可能是一些占位符,例如 be "%s",但第二个参数没有任何内容 - 用于存储扫描结果的缓冲区的内存地址。

标签: cscanftr24731

解决方案


scanf_s接受一个变量的参数列表。第一个参数是强制性的,带有转换规范的字符串,以下参数取决于格式字符串中存在的转换规范。

对于每个转换规范和%s,都需要 2 个转换参数:一个指向( ) 的指针和一个以指定参数指向的数组大小的类型传递的数字。%c%[scanf_scharchar *rsize_tchar *

这是一个例子:

#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;
}

但是请注意,支持scanf_s远非普遍。Microsoft 平台通常支持它,但语义不同,而 linux 和 Mac C 库通常不支持。阅读这个问题以了解 为什么 gcc 没有实现 _s 函数?


推荐阅读