【问题标题】:Reading boolean with fscanf使用 fscanf 读取布尔值
【发布时间】:2018-01-20 02:38:38
【问题描述】:

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

我的问题是,除了解释的解决方案之外,还有更简洁直接的方法来避免这个问题吗?

【问题讨论】:

标签: c boolean scanf


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2021-09-14
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多