与atoi合作

时间:2011-04-29 18:58:28

标签: c atoi

我一直在从几个不同的角度攻击atoi,试图从一个字符串中一次提取整数。

问题1 - 调整数组大小
这个50个字符的数组应该是50或51(占空终结符)吗?

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250";

问题2 - atoi输出

我在这里做错了什么?

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250";
int one = 0;
char aChar = fiftyNumbersOne[48];
printf("%c\n",aChar);//outputs 5 (second to last #)
one = atoi(&aChar);
printf("%d\n",one);//outputs what appears to be INT_MAX...I want 5

4 个答案:

答案 0 :(得分:7)

问题1

数组的长度应为51.但您可以通过简单地执行char fiftyNumbersOne[] = "blahblahblah";来避免手动计算出来。

问题2

aChar不是指向原始字符串的指针;它只是一个孤立的char漂浮在某个地方的内存中。但是atoi(&aChar)将它视为指向以null结尾的字符串的指针。它只是简单地遍历内存,直到碰巧在某个地方找到0,然后解释它所发现的所有内容。

你可能想要:

one = aChar - '0';

这取决于09的字符值保证是连续的。

答案 1 :(得分:3)

  1. 51
  2. 那是因为aChar不是以空值终止的。如果您只想获得char的整数值,只需使用

    即可
    one = aChar - '0';
    

答案 2 :(得分:1)

  

问题1 - 调整数组的大小   这个50个字符的数组大小为50   或51(占无效   终止子)?

你总是希望一个比你需要存储的数组更大的数组(以考虑空终止符)。因此,您的50个字符应存储在51的数组中。

  

我在这里做错了什么?

尝试null将输入字符串终止为atoi。文档说atoi应该被赋予一个字符串的指针 - 这与一个非终止的单个字符不同。您发布的当前代码的结果在不同平台上有所不同(我在unbuntu / gcc上得到-1)。

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250";
int one = 0;
char aChar = fiftyNumbersOne[48];
char intChar[2];
printf("%c\n",aChar);//outputs 5 (second to last #)
sprintf(intChar, "%c", aChar); //print the char to a null terminated string
one = atoi(&intChar);
printf("%d\n",one);//outputs what appears to be INT_MAX...I want 5

答案 3 :(得分:0)

  

这个50个字符的数组是50或51(为了说明空终止符)吗?

51,但你也可以宣布它没有大小。

char foo[] = "foo";
  

我在这里做错了什么?

我没有阅读atoi的文档。 aCharchar,因此您将正确的类型传递给atoi,但atoi期望此类型表示一个字符串,通常由字符终止'\ 0'。您的“字符串”未终止。

对此的一个解决方案是

char aString[2];
aString[0] = fiftyNumbersOne[48];
aString[1] = '\0';
atoi(aString);

另一个是fiftyNumbersOne[48] - '0'而不是调用atoi,因为在ASCII中,十进制代码是连续的,并且从0增加到9。