【问题标题】:Working with atoi与 atoi 合作
【发布时间】:2011-04-29 18:58:28
【问题描述】:

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

【问题讨论】:

    标签: c atoi


    【解决方案1】:

    问题 1

    数组的长度应该是 51。但您可以避免手动计算,只需执行 char fiftyNumbersOne[] = "blahblahblah";

    问题 2

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

    你可能想要:

    one = aChar - '0';
    

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

    【讨论】:

    • 谢谢,这很有帮助。最后一个问题。为什么要获取字符串中的最后一个字符,我需要使用索引 49?我以为它会是索引 50...?
    • @P.Brian.Mackey,因为数组在 C 中是从零开始的。第一个元素的索引为 0,第二个元素的索引为 1,依此类推,第 n 个元素的索引为 n-1。跨度>
    • @P.Brian:因为数组在 C 中是基于 0 的。所以第一个元素是 x[0],第二个是 x[1],以此类推。
    • 谢谢奥利。我对来自 C# 的数组感到有点失望。它很相似,但是有那个空终止符让我失望。我需要更多练习。
    【解决方案2】:
    1. 51.
    2. 这是因为aChar 不是以空值结尾的。如果您只想获取char 的整数值,只需使用

      one = aChar - '0';
      

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这个由 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。

        【讨论】:

          猜你喜欢
          • 2022-11-19
          • 2014-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-16
          • 2010-11-09
          相关资源
          最近更新 更多