能否直接用scanf读取<stdbool.h>定义的bool类型变量?
能否直接用scanf读取bool类型变量?
答案是:没办法直接用标准的%d格式符读取bool变量,但可以通过匹配bool实际存储类型的格式符来实现,不需要中间int变量。
为什么不能直接用%d?
C标准里并没有为bool(它是_Bool的别名,来自<stdbool.h>)定义对应的scanf格式说明符。%d是给int类型用的,如果你直接写scanf("%d", &check),这里的&check是bool*类型,和%d要求的int*类型不匹配,属于未定义行为——虽然有些编译器可能碰巧能运行,但会有内存越界的风险(因为bool通常占1字节,而int占4字节,scanf会往&check指向的地址写入4字节数据,可能覆盖相邻内存)。
不用中间变量的解决方法
绝大多数编译器里,bool的底层实现和unsigned char一致(大小为1字节),所以可以用%hhu格式符(对应unsigned char类型)来直接读取输入到bool变量中:
修改后的代码如下:
#include <stdio.h> #include <stdbool.h> int main(void){ bool check; printf("Do you have a dog? \n(1=yes 0=no)\n"); // 用%hhu格式符直接读取到bool变量 scanf("%hhu", &check); if(check == true){ printf("Good! I love dogs :)"); }else{ printf("You need to buy one! \nThey're very cute..."); } return 0; }
注意事项
- 这种方法依赖编译器对
bool的通用实现(_Bool大小为1字节),这是目前所有主流编译器都遵循的规则,也符合C标准对_Bool的要求(至少占1字节)。 - 输入0时
check会被设为false,输入任何非0值(比如1)都会被设为true,完全符合bool的语义。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

