根据该标准,"功能atof,atoi,atol,和atoll需要不影响整数表达式的值errno上的误差.如果结果的值不能表示,该行为是未定义".(7.20.1,C99中的数字转换功能).
所以,从技术上讲,任何事都可能发生.即使对于第一种情况,由于INT_MAX保证至少为32767,并且由于20234543大于此,因此它也可能失败.
为了更好地检查错误,请使用strtol:
const char *s = "232B";
char *eptr;
long value = strtol(s, &eptr, 10); /* 10 is the base */
/* now, value is 232, eptr points to "B" */
s = "20234543";
value = strtol(s, &eptr, 10);
s = "123456789012345";
value = strtol(s, &eptr, 10);
/* If there was no overflow, value will contain 123456789012345,
otherwise, value will contain LONG_MAX and errno will be ERANGE */
Run Code Online (Sandbox Code Playgroud)
如果你需要解析其中带有"e"的数字(指数表示法),那么你应该使用strtod.当然,这些数字是浮点数,然后strtod返回double.如果要从中生成一个整数,可以在检查正确的范围后进行转换.
你可以自己测试这种东西.我复制了Cplusplus参考站点的代码.看起来你对前两个例子的直觉是正确的,但第三个例子返回'0'.'E'和'e'被视为'B'也在第二个例子中.
所以规则是
成功时,该函数将转换后的整数作为int值返回.如果无法执行有效转换,则返回零值.如果正确的值超出可表示值的范围,则返回INT_MAX或INT_MIN.
| 归档时间: |
|
| 查看次数: |
18626 次 |
| 最近记录: |