数组值不更新

array value not updating

我有一个 strtok 实现(某种程度上),但它不打印令牌!

char *tokenizer(char s[], const char *delimiter) {
     char *p;                   //return value of function
     int i = 0;
     while(s[i] != *delimiter)  //to get the size of array just right
         i++;

     char arr[i+1];
     p = arr;                  //can't return an array, so assigned to a
                               //pointer       
     int j = 0;
     i = 0;
     while(s[i]!=*delimiter) {
           arr[j] = s[i];
           i++;
           j++;
     }
     arr[j] = '[=10=]';     
     printf("%s\n",p);         //this statement works, but if excluded
                               //main prints nothing.
     return p;
}

这个函数被调用如下,从 main:

char s[] = "tab-tab";
const char del[2] = "-";
char *p;
p = tokenizer(s, del);
printf("%s\n", p);        //prints nothing without the printf in
                          //tokenizer

我尝试用 gdb 调试,并在每一行之后检查局部变量的值。 ptokenizer 内用 arr[j] 更新,但一旦 tokenizer 完成并且帧移回 main.

就会变为零

mainp的值并没有变成NULL,而是变成了一个空字符串,打印出来!

但是,如果包含 tokenizer 中的 printfmain 中的 p 会打印令牌。

这已经包含解决方法。我知道这不可能是 strtok 的实现方式。我从一个更复杂的 "expertish" 版本开始,它有指针,但无法让它工作,所以选择了这个 "beginner" 版本。

因为你的指针指向的是栈中的内存地址,一旦你的函数返回,指向的内存地址不存在了,你需要创建动态分配的内存来访问函数外的变量。 C

的美丽
char *tokenizer(char s[], const char *delimiter) {
    char *arr;

    int i = 0;
    while(s[i] != *delimiter)
        i++;
    // Initialize variable in the heap
    if (!(arr = malloc(sizeof(char *) * (i+1))))
        return NULL;
    // Clear the array
    bzero(arr, (i+1));      
    int j = 0;
    i = 0;
    while(s[i]!=*delimiter) {
        arr[j] = s[i];
        i++;
        j++;
    }
    arr[j] = '[=10=]';
    // return pointer
    return arr;
}

您应该确保释放 main 中的内存以防止内存泄漏。