C语言使用scanf读取bool类型变量出现格式不匹配警告如何解决
问题修复方案
告警原因
%d是scanf专门用来读取int类型输入的格式符,要求传入的参数必须是int类型变量的地址。而你代码里的hasKitchen、hasAuditorium是bool类型,对应的指针类型是_Bool*,和%d要求的int*不匹配,所以触发了格式检查告警。虽然部分场景下代码碰巧能正常运行,但这属于未定义行为,存在稳定性隐患,因此校验系统会抛出告警。
修复方案(兼容性最优,适配所有C99及以上编译环境)
使用临时int类型变量承接用户输入的0/1值,再赋值给bool类型变量即可,原有业务逻辑完全不需要修改:
// 可以在变量定义区新增临时int变量,也可以在输入逻辑前临时定义 int tempInput; // ... 原有其他输入代码保持不变 ... printf("HAS KITCHEN? (0-FALSE, 1-TRUE) >>\n"); scanf("%d", &tempInput); hasKitchen = tempInput; printf("HAS AUDITORIUM? (0-FALSE, 1-TRUE) >>\n"); scanf("%d", &tempInput); hasAuditorium = tempInput; // ... 后续所有逻辑代码、输出代码均保持不变 ...
可选方案(仅支持C23及以上标准)
如果你的编译环境支持最新的C23标准,可以直接使用bool类型专属的%b格式符,无需临时变量:
scanf("%b", &hasKitchen); scanf("%b", &hasAuditorium);
注意:学校校验系统大概率使用的是旧版C标准,不支持
%b格式符,优先选择第一种修复方案即可完全消除告警。
内容的提问来源于stack exchange,提问作者Tomaso
相关产品推荐
相关产品推荐

