为什么我在调用 strtok_r 时遇到段错误?
Why am I getting a seg fault while calling strtok_r?
因此,每当我尝试调用 strtok_r 时都会遇到段错误,但我不完全确定原因。我在这段代码中遇到了这个错误。
我知道我的错误来自这部分代码,因为如果我要取出这个 while 循环,并用简单的 printf(str) 替换;我没有收到任何错误并且打印正确。
下面是我的方法包含 strtok_r:
void parseCommand(char *str)
{
char *curr;
char *temp = str;
char **args=NULL;
int i = 0;
curr=strtok_r(temp, " ", &temp);
while(curr!=NULL){
args[i]=curr;
curr=strtok_r(NULL," ",&temp);
i++;
}
for(int j = 0;j<i-1;j++){
printf("%s", args[j]);
}
}
如果我对段错误的理解是正确的,那么发生这种情况是因为我试图访问该进程无权访问的某种内存,但我不确定为什么。任何帮助!
编辑:我尝试对此进行了一些试验,并假设我的字符串末尾没有空终止符,但是当我添加行时
strncat(cur,"[=12=]",50);
在我的 while 循环内部,就在我分配给 args[i] 之前,产生了相同的结果。
编辑:更新了strtok_r用法
我看到两个问题:
没有内存分配给 args
错误使用strtok_r
要解决第一个问题,您可以在找到新标记时使用 realloc
。
要解决第二个问题,您需要使用 str
调用 strtok_r
一次,然后在其余时间调用 NULL
。
类似于:
void parseCommand(char *str)
{
char *curr;
char **args=NULL;
char *saveptr;
int i = 0;
// Look for first token, i.e. pass str
curr = strtok_r(str, " ", &saveptr);
while(curr != NULL){
// Allocate memory for the pointer
char **p = realloc(args, (i + 1) * sizeof *p);
if (p == NULL) exit(1);
args = p;
// Save the pointer
args[i]=curr;
i++;
// Look for next token, i.e. pass NULL
curr = strtok_r(NULL, " ", &saveptr);
}
for(int j = 0; j < i; j++){
printf("%s\n", args[j]);
}
}
当你调用函数时:
char some_text[] = "Hello how are you";
parseCommand(some_text);
不要点赞
parseCommand("Hello how are you"); // Illegal
strtok_r
将修改传递的字符串,因此您必须向它传递一个可以修改的字符串。
因此,每当我尝试调用 strtok_r 时都会遇到段错误,但我不完全确定原因。我在这段代码中遇到了这个错误。
我知道我的错误来自这部分代码,因为如果我要取出这个 while 循环,并用简单的 printf(str) 替换;我没有收到任何错误并且打印正确。
下面是我的方法包含 strtok_r:
void parseCommand(char *str)
{
char *curr;
char *temp = str;
char **args=NULL;
int i = 0;
curr=strtok_r(temp, " ", &temp);
while(curr!=NULL){
args[i]=curr;
curr=strtok_r(NULL," ",&temp);
i++;
}
for(int j = 0;j<i-1;j++){
printf("%s", args[j]);
}
}
如果我对段错误的理解是正确的,那么发生这种情况是因为我试图访问该进程无权访问的某种内存,但我不确定为什么。任何帮助!
编辑:我尝试对此进行了一些试验,并假设我的字符串末尾没有空终止符,但是当我添加行时
strncat(cur,"[=12=]",50);
在我的 while 循环内部,就在我分配给 args[i] 之前,产生了相同的结果。
编辑:更新了strtok_r用法
我看到两个问题:
没有内存分配给
args
错误使用
strtok_r
要解决第一个问题,您可以在找到新标记时使用 realloc
。
要解决第二个问题,您需要使用 str
调用 strtok_r
一次,然后在其余时间调用 NULL
。
类似于:
void parseCommand(char *str)
{
char *curr;
char **args=NULL;
char *saveptr;
int i = 0;
// Look for first token, i.e. pass str
curr = strtok_r(str, " ", &saveptr);
while(curr != NULL){
// Allocate memory for the pointer
char **p = realloc(args, (i + 1) * sizeof *p);
if (p == NULL) exit(1);
args = p;
// Save the pointer
args[i]=curr;
i++;
// Look for next token, i.e. pass NULL
curr = strtok_r(NULL, " ", &saveptr);
}
for(int j = 0; j < i; j++){
printf("%s\n", args[j]);
}
}
当你调用函数时:
char some_text[] = "Hello how are you";
parseCommand(some_text);
不要点赞
parseCommand("Hello how are you"); // Illegal
strtok_r
将修改传递的字符串,因此您必须向它传递一个可以修改的字符串。