为什么sscanf不能正常工作与bool类型
Why does sscanf not work properly with a bool type
代码的输出:
const char *buff = "*_2D 1";
char field[10];
int flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%in", field, flag);
为field:*_2D flag:1
然而,将int
变为bool
会导致奇怪的行为:
const char *buff = "*_2D 1";
char field[10];
bool flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%in", field, flag);
输出为field: flag:1
想象一下,如果bool
只有一个字节,而不是int
使用的四个(甚至八个)字节。然后告诉sscanf
&flag
是指向int
的指针,最终会覆盖堆栈上其他地方的三个或七个字节——这可能就在field
变量的顶部。该空间将被0字节填充,有效地终止字符串。
bool
是int
的独立类型,并且可能是单个字节(在大多数常见平台上小于int
)。
sscanf
不是类型安全的;您告诉它(使用%d
转换说明符)您正在提供指向int
的指针,因此它假设在那里编写int
是安全的。如果实际类型较小,则会得到未定义行为;最有可能的是,其他局部变量将被覆盖,或者堆栈帧将被损坏。在本例中,它看起来像是用整数值1
的零值字节覆盖了field
的开头。
这可能是因为sizeof(bool)
有时是1
?我不太懂c++,但在C中这是未定义行为
根据sscanf的规范,%d的描述为:
匹配一个可选的带符号十进制整数…在没有大小修饰符的情况下,应用程序应确保对应的实参是指向int的指针。
同样来自同一规范,
如果转换的结果不能在提供的空格中表示,则该行为未定义。
Since sizeof(bool) <sizeof(int),你就进入了可怕的未定义行为区,任何事情都有可能发生。>
sscanf
函数失败,因为bool
不是int
而是char
试试这个:
const char *buff = "*_2D 1";
char field[10];
char flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%in", field, flag);
它会给你同样的错误
如果你正在使用c++(这似乎是从你的评论的情况下),为什么不使用c++流代替C风格的scanf
方法?
const std::string buff = "*_2D 1";
std::string field;
bool flag = false;
std::istringstream ss(buff);
ss >> field >> flag;
std::cout << "field:" << field << " flag:" << flag << std::endl;
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 写入向量<向量<bool>>
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- 如果 (QString.contains()) 不能正常工作,请使用 temp bool 变量进行更正
- 返回 bool 的函数即使返回 1 或 0 也能工作
- 安全bool习惯用法bool_type(和安全bool习惯用法)是如何工作的
- 为什么sscanf不能正常工作与bool类型