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++){ ... }
我正在尝试拆分 "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++){ ... }