用fscanf读取布尔值

用fscanf读取布尔值,c,boolean,scanf,C,Boolean,Scanf,今天我遇到了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.nV

今天我遇到了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);

我的问题是,除了所解释的解决方案之外,还有没有一种更干净、更直接的方法来避免这个问题?

您提出的解决方案是唯一可移植的

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

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


注意
printf()
没有类似的问题。传递给
printf()
\u Bool
被提升为
int
,因此
%d
可以。

可能重复@EugeneSh。那篇帖子说布尔在阅读时得到提升。OP的问题在于写作