为什么将字符串传递给scanf()在C中编译得很好?

时间:2015-06-10 16:29:58

标签: c scanf undefined-behavior

我最近编写了一个简单的程序,我错误地使用scanf()而不是printf()来在控制台上显示消息。我原本期望得到编译时错误,但它编译得很好没有警告和&在运行时崩溃。我知道scanf()用于从键盘输入。我不应该在以下程序中出错吗?

#include <stdio.h>
int main()
{
    scanf("Hello world");   // oops, It had to be printf()
    return 0;
}

是否调用未定义的行为(UB)?在C标准中有没有提到这个?为什么在编译时没有检查是否正确&amp;有效的参数是否传递给scanf()函数?

4 个答案:

答案 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。这就是为什么它编译得很好,但看起来你的参数与它预期的不匹配,所以它在运行时崩溃(或者只是退出)。