为什么在调用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,"\0",50);

在我的while循环内部,就在我分配给args [i]之前,产生了相同的结果。

编辑:更新了strtok_r的用法

解决方法

我看到两个问题:

  1. 没有分配内存给args

  2. 错误使用strtok_r

要解决第一个问题,可以在发现新令牌时使用realloc

要解决第二个问题,您需要先使用strtok_r致电str,然后在其余时间致电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将修改传递的字符串,因此您必须将传递的字符串传递给它。