首页 > 解决方案 > scanf 读取错误,因为使用 %d 读取 bool

问题描述

#include <cstdio>
int main() {
  int a;
  bool b;
  scanf("%d %d",&a, &b);
  printf("%d %d\n", a, b);
}

当我输入 123 和 1,然后程序输出 0 和 1。

你能告诉我为什么会发生这种情况以及 scanf 是如何工作的吗?

标签: c++scanf

解决方案


当您使用 时&b,您将错误的指针类型传递给函数。之后,程序会受到未定义行为的影响。

之后不要试图理解程序。这样做是没有意义的。在您的程序执行导致未定义行为的代码后,任何事情都可能发生。

仅供参考。scanf不支持将格式说明符读入类型的对象bool。您可以将值 0 和 1 读入类型变量,int或者short然后bool适当地分配给类型变量。

int a;
bool b;
int dummy;
scanf("%d %d", &a, &dummy);
b = (dummy == 1);

更好的是,将流提取运算符与std::cin.

int a;
bool b;
std::cin >> a >> b;

推荐阅读