【发布时间】:2022-06-30 00:02:37
【问题描述】:
int i,f;
f = scanf("%d",&i);
当我输入输入为 3333333333333333333333(大于 int 的容量)时。 f的值不应该是0吗?
【问题讨论】:
-
scanf()和朋友不要做溢出检查。 -
忘记使用
scanf进行用户输入然后验证该输入的想法,这是无法完成的,scanf的设计并未考虑到这一点。使用fgets读取整行,然后解析输入,可能使用strtol或strtod。 -
继 Jabberwocky 的评论。
scanf非常适合快速而肮脏的输入。但是,面对您希望干净可靠地检测到的可能错误,对于强大的真实世界输入来说,这绝对是糟糕的——基本上是无用的。 -
scanf函数——整个家族——在数字输入溢出时具有未定义的行为。这意味着:不仅无法检测到这种输入错误,C 库还允许使您的程序崩溃,因为输入的数字太多。而且我不能认为编译器可以从这种情况中得出一个虚假的假设,但我不能排除这种可能性。scanf系列已按规定损坏,根本不应使用。
标签: c unix error-handling integer scanf