2012-01-10 44 views
0

任何人都可以告訴我這段代碼有什麼問題嗎?爲什麼strtol和strtok的組合不起作用?

for(int i=0;i<4;i++) 
{ 
    long int a = strtol(strtok("1-2-3-4","-"),(char**)NULL,10); 
    cout << a <<endl 
} 

我在Solaris Unix上運行。這給我一個分段錯誤。

故障發生在strtol()

回答

1

問題是軍團。

我認爲核心轉儲是因爲字符串"1-2-3-4"存儲在只讀存儲器中,所以當strtok()修改它(隔離第一個令牌)時,程序崩潰。你說崩潰在strtol();這會暗示strtok()的返回值爲NULL。

strtok()的第一個呼叫使用該字符串作爲參數;第二次調用在它的位置傳遞NULL來指示'繼續你上次離開的位置'。正如所寫的,如果字符串是可修改的,那麼你會解析1四次。

這是更接近正確的(雖然未經測試):

char input[] = "1-2-3-4"; 
char *data = input; 
for (int i = 0; i < 4; i++) 
{ 
    char *token = strtok(data, "-"); 
    if (token != 0) 
    { 
     long int a = strtol(token, NULL, 10); 
     cout << a << endl; 
    } 
    data = NULL; 
} 

一般情況下,你需要做的錯誤檢測從strtol();此外,這樣做是相當充滿的。但是,對於示例字符串,您不必擔心這一點。

+1

這一次你打我! =) – 2012-01-10 07:02:15

+0

很好;你贏了一些,你輸了一些。有一個投票。 – 2012-01-10 07:09:27

1

錯誤發生在撥打strtok,而不是strtol。您不能在字符串上調用strtok,因爲它會嘗試修改字符串。修改字符串文字會導致C++中的未定義行爲。

1

由於問題已經討論過,我想表現出另一種方法:

#include <stdio.h> 
#include <string.h> 

    int main() 
    { 
     long int a; 
     char str[] ="1-2-3-4"; 
     char * pch; 

     pch = strtok (str,"-"); 
     while (pch != NULL) 
     { 
     a = strtol(pch,(char**)NULL,10); 
     cout << a <<endl; 

     pch = strtok (NULL, "-"); 
     } 
     return 0; 
    } 
相關問題