【问题标题】:How to convert using atoi and strtok with multidimesional arrays?如何将 atoi 和 strtok 与多维数组一起使用?
【发布时间】:2021-03-08 19:55:55
【问题描述】:
Okay so i have this mltidim array filled with these numbers,

我希望在这些位置将它们转换为整数 所以它会是一个 int multidim arrayint intarray[2][5][12]; 关于让转换器解决问题的任何提示?我在这个问题上已经有一段时间了,它 感觉就像我接近了!

char 字符数组[2][5][40] = {

        {
                {"307,07,33,307,11,44,307,12,31,307,16,10"},
                {"308,07,52,308,11,52,308,12,35,308,16,18"},
                {"309,07,24,309,11,40,309,12,30,309,16,14"},
                {"310,07,15,310,11,38,310,12,36,310,16,27"},
                {"311,07,12,311,11,47,311,12,30,311,16,12"}
        },

        {
                {"314,07,12,314,11,34,314,12,27,314,16,52"},
                {"315,07,15,315,11,49,315,12,31,315,16,13"},
                {"316,07,59,316,11,44,316,12,38,316,16,42"},
                {"317,07,52,317,11,41,317,12,30,317,16,12"},
                {"318,08,03,318,11,32,318,12,39,318,16,07"}
        }
};

这就是我尝试转换的方式,但它甚至不允许我调试只是弹出一个奇怪的错误..

int intarray[2][5][12];
    for(int i = 0; i < 2 ; i++){
        for(int j = 0; j < 5;j++){
            for(int k = 0; k < 40;k++){
                intarray[i][j][k] = atoi(strtok(chararray[i][j][k],","));
            }
        }
    }

【问题讨论】:

  • err,k 的绑定值为 40,但 intarray 的大小只有 12。
  • 是的,因为char数组是40,所以只有strtok碰到","时才会加到int数组中
  • chararray 的大小在第二个循环中无关紧要。它将尝试写入 intarray[i][j][39],尽管值或 chararray 的大小,并且很可能会因内存错误而失败。

标签: arrays c multidimensional-array integer converters


【解决方案1】:

intarray[i][j][k] 代表i==0j==0k==0,代表3,即驻留在intarray[0][0][0] 的字符。这是单个char,无法使用strtok() 处理。

你真正想传递给strtok()的是一个完整的以空结尾的字符串:

char chararray[0][0]

这是包含"307,07,33,307,11,44,307,12,31,307,16,10"的40个字符的缓冲区。
但是因为您可能不想破坏数组,所以您应该从获取字符串的副本开始,如下所示:

int intarray[2][5][12] = {{0}};//zero before using
int i=0;
char *dup = strdup(chararray[0][0]);//in your actual code this will be in
                                    //a loop of `i,j` indexes, each one
                                    //yielding the character buffers: 

            //{"307,07,33,307,11,44,307,12,31,307,16,10"},
            //{"308,07,52,308,11,52,308,12,35,308,16,18"},
            //{"309,07,24,309,11,40,309,12,30,309,16,14"},
            //{"310,07,15,310,11,38,310,12,36,310,16,27"},
            //{"311,07,12,311,11,47,311,12,30,311,16,12"}

            //{"314,07,12,314,11,34,314,12,27,314,16,52"},
            //{"315,07,15,315,11,49,315,12,31,315,16,13"},
            //{"316,07,59,316,11,44,316,12,38,316,16,42"},
            //{"317,07,52,317,11,41,317,12,30,317,16,12"},
            //{"318,08,03,318,11,32,318,12,39,318,16,07"}



if(dup)
{
    tok = strtok(dup, ",\n");
    while(tok)
    {
         intarray[0][0][i] = atoi(tok);
         tok = strtok(NULL, ",\n");
         i++;
    }
    free(dup);//so you can use it again and again for the other sub-strings.
    ....

按照这种方法,所有其他字符串都可以解析成intarray

【讨论】:

    【解决方案2】:

    每个chararray[i][j] 都是一个字符串 - chararray[i][j][k] 是该字符串中的单个字符。不幸的是,当它需要字符串的第一个元素的地址时,您将 单个字符 传递给 strtok

    当您对字符串中的重复元素进行标记时,您只需传递基地址一次,然后为字符串的其余部分传递 NULL。所以你的循环需要是

    for(int i = 0; i < 2 ; i++){
        for(int j = 0; j < 5;j++){
            intarray[i][j][0] = atoi( strtok( chararray[i][j], "," ) );
            for(int k = 1; k < 40;k++){
                intarray[i][j][k] = atoi( strtok( NULL, "," ) );
            }
        }
    }
    

    请注意,这假定您的输入始终格式正确 - 没有任何错误或完整性检查。

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2016-07-30
      • 2016-11-15
      相关资源
      最近更新 更多