4

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

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

==7069== Conditional jump or move depends on uninitialised value(s)  
==7069==    at 0x40B61A3: strtok (strtok.S:160)  
==7069==    by 0x8048842: main (main.c:58)

这是我认为 valgrind 指责的功能:

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

这可能是因为线路NULL适用于我的大部分电话strtok吗?

这是我对该函数的调用:

strcpy(performer, getNextToken(inputLine));  
strcpy(title, getNextToken(NULL));  
strcpy(charMin, getNextToken(NULL));  
/*etc...*/

我不知道是什么原因造成的,我给出的所有值strtok都是我所期望的。另外我偶尔会遇到堆栈粉碎错误,我不知道为什么。

4

2 回答 2

7

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

char * getNextToken (char * line){
    const char *delim = ",";
    return strtok(line, delim);
}
于 2011-03-09T05:35:28.143 回答
1

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

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

于 2011-03-09T05:42:19.250 回答