我一直在从几个不同的角度攻击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
答案 0 :(得分:7)
问题1
数组的长度应为51.但您可以通过简单地执行char fiftyNumbersOne[] = "blahblahblah";
来避免手动计算出来。
问题2
aChar
不是指向原始字符串的指针;它只是一个孤立的char
漂浮在某个地方的内存中。但是atoi(&aChar)
将它视为指向以null结尾的字符串的指针。它只是简单地遍历内存,直到碰巧在某个地方找到0
,然后解释它所发现的所有内容。
你可能想要:
one = aChar - '0';
这取决于0
到9
的字符值保证是连续的。
答案 1 :(得分:3)
那是因为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
的文档。 aChar
是char
,因此您将正确的类型传递给atoi
,但atoi
期望此类型表示一个字符串,通常由字符终止'\ 0'。您的“字符串”未终止。
对此的一个解决方案是
char aString[2];
aString[0] = fiftyNumbersOne[48];
aString[1] = '\0';
atoi(aString);
另一个是fiftyNumbersOne[48] - '0'
而不是调用atoi
,因为在ASCII中,十进制代码是连续的,并且从0增加到9。