当前位置: 首页 > 知识库问答 >
问题:

为什么scanf在C中的布尔输入工作异常?

臧梓
2023-03-14

我正在尝试获取3个布尔变量和1个int变量的输入。即使我给出了正确的输入,它的行为也不正确。

我正在使用%d作为 stdbool.h布尔的格式说明符,如@taufique在扫描中的格式说明符中建议,用于 C 中的布尔数据类型

以下是我的代码及其行为:

#include <stdio.h>
#include <stdbool.h>
int main( )
{
    bool health,sex,living;
    int age;
    scanf("%d%d%d%d",&sex,&health,&living,&age);
    printf("\n%d %d %d %d\n",sex,health,living,age);
}

慰问:

0 1 0 25
0 0 0 25

对于其他一些输入:

1 0 0 26
0 0 0 26

但是,当使用临时整数变量来获取@ouah在扫描中相同的格式说明符中获取C中布尔数据类型的输入时,它工作正常。

那么,为什么scanf行为不当呢?

PS:对于某些输入,它确实可以正常工作:

0 0 1 26
0 0 1 26

共有2个答案

漆雕亮
2023-03-14

bool没有格式说明符。因为对于bool来说,它应该是什么样子还不太清楚。

有很多可能性:

  • 是/否
  • 年/否
  • 真/假
  • 断续器
  • 上述任何不同的案例版本
  • 当地人呢?
  • 1/0

与数字及其不同格式不同,上述可能性具有不同的语义。因此,使用单个说明符支持它们都是不可取的。

因此,如果你想支持它,你必须自己选择和实现它。

盖高畅
2023-03-14

< code>bool没有格式说明符,有一个也没有多大意义。用户会键入什么,< code >“true”?除了< code>int之外,不能将< code>%d用于任何其他类型。

如果出于某种原因需要从 stdin 获取布尔输入,请使用 int10,然后稍后将其转换为 bool。例如:

int living; 
scanf("%d", &living);
bool is_living = living;

intbool 的转换将自动将任何非零值转换为 true,将零转换为 false

 类似资料:
  • 因此,我是一个新的Java程序员,我正试图弄清楚为什么一段代码不能工作。我遇到的问题是“String interests=input.nextLine();”这一行,它跳过了用户的输入并跳转到下一个System.out,所以它只显示“Your Profile...”。在允许用户输入任何数据之前。抱歉,如果这是一个愚蠢的问题,我是很新的!

  • 我对JAVA中的字符串比较情况有一些疑问 这是一个代码 } 这是我对5以上输出的看法。 > 's3==s4' `s1.equals(s3)' 's4.intern()==s4' “s5==s2”:s5是s1。s1与s2相同。 我的意见是真的吗?我真的需要帮助...我马上就要考试了谢谢大家!

  • 我对C中内置类型的一些行为感到好奇。据我所知,使用隐式可转换性确定通用类型。我希望带有 和另一种类型的表达式会导致 bool 转换为该类型。例如,我可以看到 -

  • 问题内容: 让我们以一个简单的对象为例。我想确定“不为空” 是橙色还是灰色。 我相信AND首先出现,然后是OR。不过我有点模糊,所以这是我的问题: 有人可以指导我完成此声明,以便我确定会发生什么吗? 另外,如果加上括号会怎样?这会改变操作顺序吗? 我的操作顺序会因语言而异吗? 问题答案: Java教程有一个列表,说明了运算符优先级。将首先计算相等运算符,然后是。括号将先计算,因此添加括号可以更改顺

  • 我试图理解scanf和输入缓冲区之间的关系。我将scanf与以下格式字符串一起使用: 并尝试理解为什么我可以输入尽可能多的空白(输入,空白,选项卡)后,我输入一个数字,如54,并按回车键。 据我所知,我按下的每一个键都会被放入输入缓冲区,直到我按下回车键。 因此,如果我输入54并按Enter键,输入缓冲区包含3个元素,两个数字和换行符。所以我的缓冲区看起来像[5][4][\n] 现在从左到右计算s

  • 我正在尝试让相机功能正常工作。我正在连接的三星galaxy平板电脑上进行测试。应用程序成功启动,但导航器。照相机getpicture不会启动相机。你能帮忙吗? 以下是我遵循的步骤:我在(Windows 7)上使用以下步骤创建了cordova hello项目: A部分:(设置cordova)(此处答案的步骤):