今天我遇到了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
的东西,输入除1
或0
以外的任何内容都会创建一个对_Bool
无效的值(scanf()
将通过char
指针访问对象,可能会写入_Bool
的填充位(。
唯一安全的做法是获取可以处理的类型的输入,并在需要时将其转换为_Bool
,就像您在示例中所做的那样。
请注意,printf()
没有类似的问题。传递给printf()
的_Bool
被提升为int
,所以%d
没问题。