c - 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"
,但第二个参数没有任何内容 - 用于存储扫描结果的缓冲区的内存地址。
解决方案
scanf_s
接受一个变量的参数列表。第一个参数是强制性的,带有转换规范的字符串,以下参数取决于格式字符串中存在的转换规范。
对于每个转换规范和%s
,都需要 2 个转换参数:一个指向( ) 的指针和一个以指定参数指向的数组大小的类型传递的数字。%c
%[
scanf_s
char
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;
}
但是请注意,支持scanf_s
远非普遍。Microsoft 平台通常支持它,但语义不同,而 linux 和 Mac C 库通常不支持。阅读这个问题以了解 为什么 gcc 没有实现 _s 函数?
推荐阅读
- javascript - 为什么水平滚动条可见而垂直不可见?
- javascript - Javascript 随机字母数字生成器,特定格式
- sql-server - 如何设计存储多个描述有意义的标准的数据库表?
- java - 通过 REST 发送并使用 JPA 保存后,日期值比插入值晚两天
- java - 用于将应用程序的日期和时间与系统进行比较的 Java 代码
- jenkins - Jenkins管道-管道外功能上的“无法在空对象上调用方法”
- python - django postgres 密码认证失败
- scala - Spark 流,如何在 UI 中查看 JMX 指标
- python - 如何使用 Scikit-image 将透明 png 图像与另一个图像合并
- mysql - 选择在此位置无效,期望 (