strtok行为不一致

时间:2011-03-09 05:29:33

标签: c valgrind strtok

我正在尝试从文件中读取数据,对其进行标记并对其进行排序,但是当我运行它时strtok表现不正常,有时它有时会运行它并且我得到非常短/奇怪的标记。

Valgrind似乎认为这是因为strtok依赖于未初始化的价值(我认为):

  

== 7069 ==条件跳转或移动取决于未初始化的值(s)
  == 7069 ==在0x40B61A3:strtok(strtok.S:160)
  == 7069 == by 0x8048842:main(main.c:58)

以下是我认为valgrind指责的功能:

  

char * getNextToken(char * line){
   char delim =',';
  返回strtok(line,& delim);
  }

这可能是因为我对strtok的大部分调用都是NULL吗?

以下是我对该功能的调用:

  

strcpy(执行者,getNextToken(inputLine));
  strcpy(title,getNextToken(NULL));
  strcpy(charMin,getNextToken(NULL));
  / 等... /

我不知道是什么导致了这一点,我给予的所有价值观都是我所期待的。此外,我偶尔会得到一个堆栈粉碎错误,我不知道为什么。

2 个答案:

答案 0 :(得分:7)

strtok为两个参数采用以null结尾的字符串。你没有为你的分隔符传递一个。试试这个:

char * getNextToken (char * line){
    const char *delim = ",";
    return strtok(line, delim);
}

答案 1 :(得分:1)

关于strtok(),第一个答案是正确的。但除此之外,也可能是为什么你会得到“堆栈粉碎错误”,因为strtok会返回指向它找到的任何标记的指针,如果它比你为strcpy()的目标分配的数组大,那么很乐意溢出它。

我会考虑使用strdup()而不是strcpy()。