C语言 使用 fscanf 读取布尔值



今天我遇到了scanf函数的问题。 假设您有一个类似于以下示例的结构。

struct structA{
bool bVal;
int nVal;
}

如果运行以下代码

structA a;
a.nVal = 7;
...// Assume that we read a text file and the only text is "0"
fscanf(fp,"%d",&a.bVal);
printf("n a.bVal=%d",a.bVal);
printf("n a.nVal=%d",a.nVal);

它将打印

a.bVal = 0
a.nVal = 0

原因是 fscanf 函数假定 a.bVal 是一个整数并覆盖 a.nVal 的前 3 个字节。此问题可以通过以下脏解决方案来解决。

structA a;
a.nVal = 7;
...// Assume that we read a text file and the only text is "0"
int nBVAL;
fscanf(fp,"%d",&nBVAL);
a.bVal = nBVAL;
printf("n a.bVal=%d",a.bVal);
printf("n a.nVal=%d",a.nVal);

我的问题是,除了解释的解决方案之外,是否有一种更干净,直接的方法可以避免此问题?

您提出的解决方案是唯一的便携式解决方案。

没有_Bool的转换说明符。也不能保证_Bool的存储大小,除了它至少有CHAR_BIT位。即使您知道大小并尝试了类似%hhd的东西,输入除10以外的任何内容都会创建一个对_Bool无效的值(scanf()将通过char指针访问对象,可能会写入_Bool填充位(。

唯一安全的做法是获取可以处理的类型的输入,并在需要时将其转换为_Bool,就像您在示例中所做的那样。

请注意,printf()没有类似的问题。传递给printf()_Bool被提升为int,所以%d没问题。

最新更新