-2

我尝试阅读某些网站上的 atoi() 描述,但无法得到答案。什么会

int i = atoi("000000000000000000003");  
printf("%d", i);  

导致?它会是 3 还是会返回错误(在 atoi() 的情况下为 0)?
我目前没有任何可用的编译方法,所以我不能只测试它。

编辑:意外地将 000000000000000000003 而不是“000000000000000000003”作为参数。

Edit2:关于测试的部分不再相关,谢谢。

4

3 回答 3

2

根本不要使用atoi()。它不安全,因为它不检查输入。

考虑strtol()改用。

关于你的问题:它不会工作。参数必须是 const char* ,您在示例中拥有的是 int。(编辑后,它将返回3

于 2013-01-15T03:13:32.577 回答
2

根据引用 C90 标准的POSIXatoi是 base-10 的包装器strtol,并且该函数期望

如果 base 的值介于 2 和 36 之间,则主题序列的预期形式是表示整数的字母和数字序列,其基数由 base 指定,可选地以“+”或“-”符号开头。…</p>

主题序列被定义为输入字符串的最长初始子序列,从具有预期形式的第一个非空白字符开始。如果输入字符串为空或完全由空白字符组成,或者如果第一个非空白字符不是符号或允许的字母或数字,则主题序列不应包含字符。

所以零不会影响它;它将返回 3。

于 2013-01-15T03:25:19.087 回答
0

根据这个参考:

该函数首先根据需要丢弃尽可能多的空白字符(如在 isspace 中),直到找到第一个非空白字符。

在您的示例中,找到的第一个字符是非空格(0!=空格字符)所以..

从此字符开始,采用可选的初始加号或减号,后跟尽可能多的以 10 为基数的数字,并将它们解释为数值。

这意味着该函数读取字符,只要它们是基于 10 作为基数的数字,直到 if 找到一个不是字符,例如 a(letter 或空终止字符\0。然后...

将其内容解释为整数,该整数作为 int 值返回。

所以你的例子是这样的: int i=000000000000000000003; 如果你printf("%d", i)这个值机器将输出3,就像你的问题一样。

于 2013-01-15T03:25:25.307 回答