【问题标题】:Using atoi to fill an array of ints使用 atoi 填充整数数组
【发布时间】:2013-03-07 22:58:56
【问题描述】:

第一次在这里提问。抱歉,如果已经有关于此的线程,但我进行了一些搜索,并没有完全找到我认为我正在寻找的东西。我对 C 语言非常陌生,并且正在为我的微控制器系统课程做一些家庭作业。在我们进入嵌入式 C 之前,我们目前正在通过简单的练习,我正在尝试编写一个程序,该程序将获取一行由 10 个以逗号分隔的数字组成的文本,并用它填充一个 ints 数组。作为提示,我们被告知使用substringatoi。我想我已经接近正确了,但我无法让它正确输出我的数字。

我也不是在寻找勺子喂养的答案。现在,一些提示就足够了。在寻求解决方案之前,我想尝试自己弄清楚。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a[10];
    char str[] = {1,2,3,4,5,6,7,8,9,10}; //contains string of numbers
    int i;
    puts("This prints out ten numbers:");

    for (i = 0; i < 10; i++)
    {
        a[i] = atoi(str);
        printf("%d", a[i]);
            //i'm guessing the problem lies in one of the above two lines
    }
    return 0;
}

这正在输出以下内容:

This prints out ten numbers:
0000000000

感谢任何可以提供帮助的人! 克里斯

【问题讨论】:

  • 仅供参考 - atoi 已被弃用。它仍然有效,但更喜欢使用 strtol
  • @dbeer Turre,但有些教授没有及时了解最新情况。
  • char str [] 一个数字数组...我想你的讲师想要用双引号括起来的整个逗号分隔列表。

标签: c arrays atoi


【解决方案1】:

您说您必须使用逗号分隔的一行文本,但您实际上声明了一个包含十个(二进制)整数的char 数组。要把它变成一个字符串,你只需要这样做:

char str[] = "1,2,3,4,5,6,7,8,9,10";

然后您需要某种方式来处理此字符串,以将每个数字取出并放入您的 int 数组中。

【讨论】:

  • @MikeD:我认为这是通过处理字符串来获取数字所暗示的:)
  • 很高兴知道,atoi 会处理字符串,直到找到第一个非数字字符。
【解决方案2】:

首先,您应该声明一个string,如下所示:

char str[] = {"1,2,3,4,5,6,7,8,9,10"};

" 将数字变成了一个完整的字符串。接下来,您需要对它们进行标记并使用 &lt;string.h&gt; 库,这在这种情况下会派上用场。

以下是标记化的方法:

先定义一个令牌缓冲区:

char* token;

token = strtok(str,",");   //think of it as substring, the part of the str before the comma
for (i = 0; i < 10; i++)
{
    a[i] = atoi(token);
    printf("%d\t", a[i]);
            //i'm guessing the problem lies in one of the above two lines
    token = strtok(NULL, ","); //this line is also required for tokenizing the next element
}

使用strtok() 函数,您将逗号之间的元素分开,并得到数字字符串。使用atoi() 函数将它们转换为整数并打印出来。你可以see this reference 换成strtok() 函数以便更好地理解。

【讨论】:

  • 这应该很有用!我会试试这个。我读过有关 strtok 函数的信息,但我们还没有学过它,所以我没有想过要尝试它。
  • {"1,2,3,4,5,6,7,8,9,10"} 的类型是 char*[],而不是 char[]
【解决方案3】:

问题在于您如何创建字符串。
请原谅我之前的回答,我误解了你的问题:

简单来说,声明应该如下:

char str[] = "1,2,3,4,5,6,7,8,9, 10, 12";

接下来,您可以使用 strtok 将字符串分隔为省略分隔符的字符串数组(在您的情况下为逗号),然后将数组成员传递给atoi

现在,为什么您的代码不起作用?
首先,字符应该用撇号括起来,否则编译器会将您传递的数字作为 ASCII 值。

第二,C 中的数组是这样的: char str[] = {'1', '2', '3', '4', '5'}; 不是逗号分隔的字符串,这些逗号分隔了 ARRAY 成员,每个成员都有自己的索引,而不是整个字符串。

【讨论】:

  • “10”呢?那不是char
  • 我在这里没有对任何事情投反对票 :( 不要做假设,伙计.. 我正忙着做其他事情并试图编辑我自己的问题
  • 好吧,对不起,如果这是一个错误的指控,只是看起来很可疑,立即投反对票,没有明显的原因,但显然不是你的......
  • 没问题。现在,对于“体面”的投反对票,你能用评论解释你的反对票吗?
  • @ChrisLyttle Downvoting 需要 125 个代表。在您不小心投反对票之前,您还需要几个问题或答案;)
【解决方案4】:

您对char str[] = {1,2,3,4,5,6,7,8,9,10}; 的定义实际上设置了 将字符的值设置为 1 到 10。

在 ASCII 字符图中,这些是不可打印的控制字符。 写 '1' 而不是 1 会将值设置为 ASCII 值 1,即 0x31。

另一个错误是你定义中的逗号只分隔定义中的值,所以结果是一个没有任何分隔符的字符数组,所以 12345678910。

所以正确的方法是 char str[] = "1,2,3,4,5,6,7,8,9,10";

【讨论】:

  • 那么使用 char *str... 和使用 char str[]... 有什么区别呢?干杯顺便说一句!我已经尝试在字符串周围放入“”,但现在我得到了这个输出:这会打印出十个数字:123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 不太预期!
  • aah,只是习惯而已^^ 其实并没有太大的不同... char 类型的数组 (char[]) 与 char 类型的指针 (@ 987654324@),因为它的指向地址不能改变
  • 主要区别是您可以更改数组中的内容,但如果使用char *,则无法更改字符串中的任何内容
  • 你确定你真的用过char str[] = "1,2,3,4,5,6,7,8,9,10"
  • @ChrisLyttle:char s[] = "..." 会将该字符串复制到一个为您分配在内存中的数组中,但char *s = "..." 只会指向一个存储在二进制文件中的字符串。虽然它会在内存中,但您不能更改它,也不会分配存储空间。 (交叉发布@Legionair)
猜你喜欢
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
相关资源
最近更新 更多