我最近编写了一个简单的程序,我错误地使用scanf()而不是printf()来在控制台上显示消息。我原本期望得到编译时错误,但它编译得很好没有警告和&在运行时崩溃。我知道scanf()用于从键盘输入。我不应该在以下程序中出错吗?
#include <stdio.h>
int main()
{
scanf("Hello world"); // oops, It had to be printf()
return 0;
}
是否调用未定义的行为(UB)?在C标准中有没有提到这个?为什么在编译时没有检查是否正确&amp;有效的参数是否传递给scanf()函数?
答案 0 :(得分:6)
代码表现正常。实际上,scanf
被宣布为
int scanf(const char *format, ...);
幸运的是,format
不包含任何%
...
,format
将会调用UB。{
此外,.cont2 {
display: table;
margin: 0 auto;
}
.cont2 img {
display: block;
max-width: 100%;
}
p {
display: table-caption;
caption-side: bottom;
padding: 5px 8px;
}
是一个字符串文字,它允许编译器通过它,确保您传递与格式说明符相关的正确类型的参数,作为启用更高警告级别的健全性检查的一部分。 (-Wformat family)
答案 1 :(得分:6)
将字符串传递给scanf
可以很好地编译,因为scanf
期望一个字符串作为第一个参数。有关详细的scanf
说明,请参阅文档或编程手册。
答案 2 :(得分:4)
编译器无法读懂你的想法。
printf("Hello world")
和scanf("Hello world")
都是格式良好的。
答案 3 :(得分:-1)
scanf
does take a string paramater。这就是为什么它编译得很好,但看起来你的参数与它预期的不匹配,所以它在运行时崩溃(或者只是退出)。