如何将 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==0
、j==0
、k==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 与多维数组一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
C语言字符串相关函数使用示例 strtok_r strstr strtok atoi