繁体   English   中英

与 atoi 合作

[英]Working with atoi

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

问题 1 - 调整数组大小
这个 50 个字符的数组的大小应该是 50 还是 51(以考虑 null 终止符)?

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250";

问题 2 - atoi output

我在这里做错了什么?

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

问题 1

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

问题 2

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

你可能想要:

one = aChar - '0';

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

  1. 51.
  2. 那是因为aChar不是以空值结尾的。 如果您只想获取char的 integer 值,只需使用

    one = aChar - '0';

问题 1 - 调整数组大小 这个 50 个字符的数组的大小应该是 50 还是 51(考虑 null 终止符)?

你总是想要一个比你需要存储的数组大一个的数组(考虑到 null 终结器)。 所以你的 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

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

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM