问题描述
我正在练习c Lang strtok_r()。
这是我的代码。
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char** argv){
char* ptr = NULL;
char* next[2] = {0};
char delimiter[4];
int Now = 1;
strcpy(delimiter," \t");
// check argc number
if(argc != 3){
printf("usage : ./test {string} {string}\n");
return -1;
}
ptr = strtok_r(argv[1],delimiter,&next[1]);
printf("ptr : %s,next : %s\n",ptr,next[1]);
ptr = strtok_r(argv[2],&next[2]);
while((ptr = strtok_r(NULL,&next[1])) != NULL){
printf("%d : %s,++Now,next[1]);
}
return 0;
}
我认为代码结果将是
$ a.out "I'm test Now" "Hello every"
ptr : i'm,next : test Now
2 : test,next : Now
3 : Now,next : (null)
我的mac结果就是这样。
但是我的ubuntu20.04(Docker映像)不是。
这是在Ubuntu上执行的结果。
$ a.out "i'm test Now" "hello every"
ptr : i'm,next : test Now
2 : test Now,next :
为什么Mac和ubuntu中的结果不同
解决方法
关于:
char* next[2] = {0};
...
ptr = strtok_r(argv[1],delimiter,&next[1]);
printf("ptr : %s,next : %s\n",ptr,next[1]);
ptr = strtok_r(argv[2],&next[2]);
while((ptr = strtok_r(NULL,&next[1])) != NULL){
数组:next
有2个元素。因此,该数组的有效索引是0和1。不是1和2。
发布的代码正在访问next
数组的末尾。结果是未定义行为。
注意:数组中的有效索引为0 ...(数组中元素的数量为-1)