【问题标题】:Segmentation Fault using strtok() in C [duplicate]在 C 中使用 strtok() 的分段错误 [重复]
【发布时间】:2014-03-10 10:18:30
【问题描述】:

我使用strtok 的以下代码出现分段错误。我是否正确使用了strtok

int main()
{
    dummy("90:90");
    return 0;
}
int dummy(char *str)
{
    char *mm, *hh;
    int len = strlen(str), result;

    if (len <= 0 || len > 5)
    {
            return 0;
    }

    hh = strtok(str, ":");

    while(hh){
        printf("%s", hh);
        hh = strtok(NULL, ":");
    }

return result;
}

【问题讨论】:

    标签: c string segmentation-fault strtok


    【解决方案1】:

    strtok 修改了其参数的内容,因此您不能传递字符串文字。将其更改为:

    int main()
    {
        char str[] = "90:90";
        dummy(str);
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      您不能将strtok() 与常量字符串一起使用。这就是你在代码中所做的。

      因为strtok()编辑的字符串和常量字符串都是只读字符串。

      要解决您的问题,请以这种方式在动态分配的内存(读写内存)中复制您的字符串:

      int dummy(char *str)
      {
          char *mm, *hh;
          int len = strlen(str), result;
      
          if (len <= 0 || len > 5)
          {
                  return 0;
          }
      
          char *buf = strdup(str); // Modif here
      
      
          hh = strtok(buf, ":"); // Modif here
      
          while(hh){
              printf("%s", hh);
              hh = strtok(NULL, ":");
          }
      
          free(buf); // Modif here
      
          return result;
      }
      

      【讨论】:

        【解决方案3】:

        当函数strtok 被调用时第一个参数是一个不是NULL 的字符串,它会更改该字符串的内容,以便在接下来的调用中(使用NULL)它将能够获取下一个令牌。

        但是,您正在传递一个常量字符串,该字符串驻留在程序的(只读)代码段中。因此,在运行时,CPU 会尝试写入只读内存部分,从而导致非法内存访问。

        总之,需要在函数main的栈中声明字符串为局部数组:

        int main()
        {
            char str[] = "90:90";
            dummy(str);
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2023-03-08
          • 1970-01-01
          • 2018-02-07
          • 1970-01-01
          • 1970-01-01
          • 2012-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多