【发布时间】:2015-09-12 02:07:39
【问题描述】:
if( (*ptr != ',') || strlen(ptr+1) < sizeof(struct A) * num1)
{
printf("\n Condition satisfied.");
}
这是有问题的代码。我有一个格式为 str = "-1,ABCDEFGH" 的字符串和一个大小为 15 字节的结构 A。
我正在预先执行此操作:
number = strtoul(str, &ptr, 10);
经过这个操作,ptr 指向 ',' 和 number = -1
查看 IF 条件,第一条语句的计算结果为假(因为 *ptr = ','),第二条语句执行为 TRUE,即使它应该为假( strlen(ptr+1) 为正,并且(sizeof(struct A) * number) 是负数,仅仅是因为 num1 是负值)。
为什么这个语句被评估为真并进入 IF 块?我得到了输出“条件满足”,而我不应该。提前致谢。
【问题讨论】:
-
如果您知道第二个语句的评估不正确,为什么要向我们展示第一个?删除第一个,验证剩下的仍然会产生错误,然后给我们minimal complete example。
-
strlen和sizeof都使用无符号类型,而您还没有向我们展示num1的类型。所以num1是unsigned在这种情况下-1是一个非常大的正数,或者您忽略了有关“有符号与无符号比较”的编译器警告。 -
我已经猜到你在
sizeof(struct A)上做错了什么。在结构上使用时,您唯一应该依赖sizeof()的时间是执行memcpy()操作。我的直觉告诉我,您可能正在错误地尝试进行字符串长度检查,并且不知道结构填充。 stackoverflow.com/questions/4306186/…
标签: c if-statement sizeof strlen strtoull