Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我使用';scanf#U s';用于同时读取字符和数字?_C_Scanf - Fatal编程技术网

为什么可以';我使用';scanf#U s';用于同时读取字符和数字?

为什么可以';我使用';scanf#U s';用于同时读取字符和数字?,c,scanf,C,Scanf,此代码崩溃: scanf_s("%c %d",&ch,&x);//Run error 但这个代码是有效的: scanf_s("%c",&ch); scanf_s("%d",&x);//Run succeed 我想知道为什么第一个代码片段是错误的 “运行错误”是指 当您使用scanf\u s(与scanf)时,当我运行程序输入时,编译器有一个警告,并且出现了一些错误(与scanf)相反,您需要为%c提供一个额外的长度参数(例如,来自microsoft的关于sca

此代码崩溃:

scanf_s("%c %d",&ch,&x);//Run error
但这个代码是有效的:

scanf_s("%c",&ch);
scanf_s("%d",&x);//Run succeed
我想知道为什么第一个代码片段是错误的

“运行错误”是指
当您使用
scanf\u s
(与
scanf
)时,当我运行程序输入时,编译器有一个警告,并且出现了一些错误(与
scanf
)相反,您需要为
%c
提供一个额外的长度参数(例如,来自microsoft的关于
scanf\s
的文档):

与scanf和wscanf不同,scanf_和wscanf_需要您指定 某些参数的缓冲区大小。指定所有c、c、s、, S、 或字符串控件集[]参数

所以你必须写作

scanf_s ("%c %d", &ch, 1, &x);
表示第一个
%c
最多只能读取一个字符

请注意,
scanf_s(“%c”和&ch)应发出相同的警告/错误,因为它也缺少
%c
的强制长度参数


命令
scanf_s(“%d”和&x)是可以的,因为
%d
不需要(不得提供)额外的长度参数。

我假设您正在运行MSVC,如果您使用
scanf
而不是
scanf\u s
,则会出现错误。我还假设您希望使用前者,而不是后者。要禁用此错误,请转到项目菜单->[Project name]属性->C/C++->预处理器。在“预处理器定义”字段中,添加宏
\u CRT\u SECURE\u NO\u WARNINGS
。然后单击“应用”

现在,您应该能够像在任何其他编译器/IDE上一样使用
scanf

< P> < /P> < P>作为扩展,考虑执行<代码> SCANFYS(“%c%d”,和CH,&x)< /C> >时发生的情况。

从技术上讲,这是未定义的行为,因为您没有为
scanf\u s
指定正确的参数

然而,实际上,代码会试图将内存中的垃圾值解释为缺少的参数。也就是说,代码相当于以下内容:

scanf_s("%c %d", &ch, 0xf0000000, 0xdeadbeef);
此处
0xf0000000
表示变量
x
的地址。
scanf_s
的代码将其解释为缓冲区大小(一个非常大的缓冲区),但这没有效果,因为
%c
告诉它只读取一个字节。此外,
0xdeadbeef
表示垃圾,代码将其解释为写入整数结果的地址。写随机地址是一个很大的禁忌,所以它崩溃了


当您的代码分别读取
char
int
时,它从来不会遇到写入随机地址的问题,因此一切正常,如果忽略编译器警告,您永远不会知道您的代码有缺陷。

什么是“运行错误”?您是指编译器发出的警告吗,还是运行程序后出现问题?无论如何,请显示相应的消息。MSVC不使用
scanf()
,但不检查
scanf_s
的参数类型,因为使用常量格式字符串很容易。。。