任何人都可以告訴我這段代碼有什麼問題嗎?爲什麼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()
。
任何人都可以告訴我這段代碼有什麼問題嗎?爲什麼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-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()
;此外,這樣做是相當充滿的。但是,對於示例字符串,您不必擔心這一點。
錯誤發生在撥打strtok
,而不是strtol
。您不能在字符串上調用strtok
,因爲它會嘗試修改字符串。修改字符串文字會導致C++中的未定義行爲。
由於問題已經討論過,我想表現出另一種方法:
#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;
}
這一次你打我! =) – 2012-01-10 07:02:15
很好;你贏了一些,你輸了一些。有一個投票。 – 2012-01-10 07:09:27