Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我打电话给strtok_\r时遇到seg故障?_C_Pointers_Segmentation Fault_Token_Strtok - Fatal编程技术网

C 为什么我打电话给strtok_\r时遇到seg故障?

C 为什么我打电话给strtok_\r时遇到seg故障?,c,pointers,segmentation-fault,token,strtok,C,Pointers,Segmentation Fault,Token,Strtok,所以,每当我打电话给strtok_r时,我都会遇到seg故障,但我不完全确定原因。我在这段代码中得到了这个错误 我知道我的错误来自代码的这一部分,因为如果我去掉这个while循环,只替换为printf(str);我没有错误,它打印正确 下面是我包含strtok_r的方法: void parseCommand(char *str) { char *curr; char *temp = str; char **args=NULL; int i = 0; curr=strtok_

所以,每当我打电话给strtok_r时,我都会遇到seg故障,但我不完全确定原因。我在这段代码中得到了这个错误

我知道我的错误来自代码的这一部分,因为如果我去掉这个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]);
  }
}
在while循环的内部,就在我分配给args[I]之前,产生了相同的结果

编辑:更新了strtok_r用法

我发现两个问题:

  • 未将内存分配给
    args

  • 错误使用strtok\u 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]);
      }
    }
    
    不要像这样打电话

    parseCommand("Hello how are you");  // Illegal
    

    strtok\u r
    将修改传递的字符串,因此您必须传递一个可以修改的字符串。

    char**args=NULL
    <代码>参数[i]=当前值。您从未为args分配过任何空间。如果我的输入长度可变,我怎么知道要分配多少空间?如果输入字符串的长度为N,则最多可以有N/2个标记。@backwardforward任意方式。有很多选择。如果需要,您可以猜测并重新分配更多。您可以分配比您需要的更多的资源,并在以后“调整大小”。还有很多其他的方法。请注意,您错误地调用了
    strtok\u r
    。只有第一次呼叫才能通过
    temp
    。以下所有调用均应通过
    NULL
    char some_text[] = "Hello how are you";
    parseCommand(some_text);
    
    parseCommand("Hello how are you");  // Illegal