2011-04-29 54 views
1

我一直在从几个不同的角度攻击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 

回答

7

问题1

数组应是长度为51.但是,可以避免手动可以认识到这一点通过简单地做char fiftyNumbersOne[] = "blahblahblah";

问题2

aChar不是指针原始字符串;它只是一个孤立的内存在某个地方浮动。但atoi(&aChar)正在将它视为一个指向空终止字符串的指针。它只是遍历内存,直到碰巧找到0的地方,然后解释它被发现为字符串的所有内容。

你可能想:

one = aChar - '0'; 

这依赖于一个事实,即09的字符值,保证是连续的。

+0

谢谢,这有很大的帮助。最后一个问题。为什么要得到我的字符串中的最后一个字符我需要使用索引49?我认为这将是指数50 ...? – 2011-04-29 19:10:03

+1

@ P.Brian.Mackey,因为数组在C中是从零开始的。第一个元素的索引为0,第二个的索引为1,第n个元素的索引为n-1。 – rlibby 2011-04-29 19:14:32

+0

@ P.Brian:因为数组是基于* 0的*,所以第一个元素是'x [0]',第二个元素是'x [1]',依此类推。 – 2011-04-29 19:14:49

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 
+0

1感谢您的另一种方法。 – 2011-04-29 19:20:01

3
  1. 这是因为aChar是不是空终止。如果你只是想获得一个char的整数值,只需使用

    one = aChar - '0'; 
    
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