2011-03-09 71 views
3

我想從文件中讀取數據,對它進行標記並對其進行排序,但是當我運行它時,strtok的行爲不正常,有時它有時不起作用,並且我得到非常短/奇怪的標記。strtok行爲不一致

Valgrind的似乎認爲這是因爲strtok的是依靠一個未初始化的值(我認爲):

== == 7069條件跳轉或移動依賴於未初始化的值(一個或多個)
== 7069 ==在0x40B61A3:strtok的(strtok.S:160)
== 7069 ==由0x8048842:主(main.c中:58)

下面是函數,我認爲Valgrind是指控:

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

難道這是因爲我的大部分調用strtok行是NULL?

這裏是我的函數調用:

的strcpy(表演者,getNextToken(inputLine));
strcpy(title,getNextToken(NULL));
strcpy(charMin,getNextToken(NULL));
/等.../

我不知道這可能是造成這一點,我給strtok的所有值都是我所期待的。另外,我偶爾會得到一個堆棧砸錯誤,我不知道爲什麼。

回答

6

strtok對兩個參數都採用以空字符結尾的字符串。你沒有通過你的分隔符。試試這個:

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

這很有道理。謝謝! – jrisebor 2011-03-09 14:41:41

+0

@ Snipe07:不客氣! – 2011-03-09 18:08:10

1

首先回答有關strtok()的權利。但除此之外,也可能是爲什麼你得到「堆棧砸錯誤」,是因爲strtok會返回一個指向它找到的任何標記的指針,並且如果它大於你爲strcpy()分配的目標數組,會高興地溢出它。

我會考慮使用strdup()而不是strcpy()。