strtok()的问题

时间:2017-11-12 19:10:34

标签: c arrays token strtok execv

我正在尝试将字符串拆分为“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;

}

1 个答案:

答案 0 :(得分:2)

这是一个很大的问题:

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

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

strcpy(arr[index], token);

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

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

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

在上一个循环之后,您初始化arr,然后index将是arr中有效元素的数量。使用它作为打印循环的结束:

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