如何将 atoi 和 strtok 与多维数组一起使用?

Posted

技术标签:

【中文标题】如何将 atoi 和 strtok 与多维数组一起使用?【英文标题】:How to convert using atoi and strtok with multidimesional arrays? 【发布时间】: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 的大小,并且很可能会因内存错误而失败。 【参考方案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, "," ) );
        
    

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

【讨论】:

以上是关于如何将 atoi 和 strtok 与多维数组一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

strtok/atoi/atof/atol函数用法 详解

C语言字符串相关函数使用示例 strtok_r strstr strtok atoi

strtok函数怎么用啊?

STM32中使用strtok,atol,atoi,memset,strlen;后使用atoi系统卡死

将 atoi 与 char 一起使用

指向多维数组 C++ 的指针