[英]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';
这取决于保证0
到9
的字符值是连续的这一事实。
那是因为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
的文档。 aChar
是char
,因此您将正确的类型传递给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.