gpt4 book ai didi

c - 使用 fscanf 读取 boolean 值

转载 作者:行者123 更新时间:2023-12-01 16:09:18 27 4
gpt4 key购买 nike

今天我遇到了 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 没问题。

关于c - 使用 fscanf 读取 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45637551/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com