为什么在Mac和Ubuntu中使用strtok_r会有不同的结果

问题描述

我正在练习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)