繁体   English   中英

为什么 sscanf 不能与 bool 类型一起正常工作

[英]Why does sscanf not work properly with a bool type

这段代码的output:

const char *buff = "*_2D 1";
char field[10];
int flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%i\n", 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:%i\n", field, flag);

output 是field: flag:1

谁能解释这里发生了什么? 我原以为 bool 会被解释为一个 int,它似乎是,但字符串的 rest 消失了。

想象一下,如果bool只有一个字节,而不是int使用的四个(甚至八个)字节。 然后告诉sscanf &flag是一个指向int的指针,最终会覆盖堆栈上其他地方的三个或七个字节——这可能就在你的field变量的顶部。 该空间将填充 0 个字节,有效地终止您的字符串。

bool是与int不同的类型,并且可能是单个字节(在大多数常见平台上小于int )。

sscanf不是类型安全的; 您正在告诉它(使用%d转换说明符)您正在提供一个指向int的指针,因此它假定在那里写一个int是安全的。 如果实际类型更小,那么您将获得未定义的行为; 最有可能的是,其他局部变量将被覆盖,或者堆栈帧将被破坏。 在这种情况下,看起来它正在用 integer 值1的零值字节覆盖field的开头。

可能是因为sizeof(bool)有时是1 所以,我不太了解 C++,但在 C 中,这将是未定义的行为。

根据sscanf 的规范, %d 的描述是:

匹配可选带符号的十进制 integer... 在没有大小修饰符的情况下,应用程序应确保相应的参数是指向 int 的指针。

同样来自相同的规格,

如果转换的结果不能在提供的空间中表示,则行为未定义。

由于 sizeof(bool) < sizeof(int),你处于可怕的未定义行为区域,任何事情都可能发生。

sscanf function 失败,因为bool不是int而是char

试试这个:

const char *buff = "*_2D 1";
char field[10];
char flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%i\n", 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM