strtok() 的问题

Issues with strtok()

我正在尝试拆分 "tmp" 中的字符串并将其放入指针数组 "arr" 中。我这样做是因为我打算在 "arr" 上使用 "execv" 但我不能,因为 "arr" 最后没有 NULL。相反,它有“(null)”,当我打印它的内容时,我得到了一个分段错误。 我如何正确设置 "arr" 以便它可以与 execv 一起使用?谢谢

#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<string.h>

int main(){

    char tmp[40] = "echo Hello World \n ";
    char *arr[40];

    char *token = strtok(tmp, " \n");
    int index = 0;

    while(token != NULL){
        arr[index] = malloc(strlen(token) + 1);
        arr[index] = token;

        index = index + 1;
        token = strtok(NULL, " \n");
    }


    for(int i = 0; i < 40; i++){
        printf("%s \n", arr[i], arr[i]);
    }


    return 0;

}

这里有个大问题:

arr[index] = malloc(strlen(token) + 1);
arr[index] = token;

您没有复制字符串,而是覆盖了指针。您应该使用 strcpy 来复制字符串:

strcpy(arr[index], token);

在这种情况下,可能不需要复制字符串,只需赋值即可。这也意味着不需要分配。


您的代码还有另一个问题:在 arr 中打印字符串的循环。

对于您拥有的字符串,您应该只有三个元素在 arr 中有效,其余的将未初始化并且 不确定。取消引用它们(就像您尝试打印它们指向的 "strings" 时所做的那样)将导致 undefined behavior.

在上一个循环之后,你初始化arr,那么index就是arr中有效元素的个数。将其用作打印循环的结尾:

for(int i = 0; i < index; i++){ ... }