1

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

问题 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

4 回答 4

7

问题 1

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

问题 2

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

你可能想要:

one = aChar - '0';

这依赖于保证 to 的字符值是连续0的这一事实。9

于 2011-04-29T19:04:29.727 回答
3
  1. 51.
  2. 那是因为aChar不是空终止的。如果您只想获取 a 的整数值char,只需使用

    one = aChar - '0';
    
于 2011-04-29T19:04:46.790 回答
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
于 2011-04-29T19:04:11.843 回答
0

这个 50 个字符的数组的大小应该是 50 还是 51(以考虑空终止符)?

51,但你也可以不带尺寸声明它。

char foo[] = "foo";

我在这里做错了什么?

atoi我猜 没有阅读文档。aChar是 a char,因此您将正确的类型传递给atoi,但atoi期望此类型表示字符串,通常以字符 '\0' 结尾。您的“字符串”没有终止。

一种解决方案是

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

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

于 2011-04-29T19:12:22.713 回答