[爆卦]Strtok是什麼?優點缺點精華區懶人包

為什麼這篇Strtok鄉民發文收入到精華區:因為在Strtok這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者kent800909 (Rebellion)看板C_and_CPP標題[問題] strtok跟遞...


開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++

額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
NO

問題(Question):
只要跑到第三層遞迴,就會當掉。
這是NFA to DFA的程式作業。

餵入的資料(Input):
NFAtable 左上(3,0)是NFAtable[1][1]
(3,0)(4,0)(0,0)
(0,0)(3,1)(2,0)
(2,0)(0,0)(4,0)
(3,*)(4,*)(*,*)

預期的正確結果(Expected Output):
DFAtable[state][input] 裡面應該要有 1,3,2

錯誤結果(Wrong Output):
trace temp裡面會變成 錯誤的Ptr

程式碼(Code):(請善用置底文網頁, 記得排版)
int cutString(char *str, int state, int input)
{
char *delim = ",";
char *temp;
temp = strtok(str, delim);

while(temp != NULL)
{
if(strcmp(temp, "0") == 0)
{
return 0;
}
DFAtable[state][input] += ',';
DFAtable[state][input] += temp;

char* pch = new char[3];
strcpy(pch, NFAtable[atoi(temp)][input].c_str());
cutString(pch, state, input);

temp = strtok(NULL, delim);
if(strcmp(temp, "0") == 0)
{
return 0;
}

pch = "";
strcpy(pch, NFAtable[atoi(temp)][input].c_str());
cutString(pch, state, input);
}
}

補充說明(Supplement):
NFAtable跟DFAtable都是string 二維陣列,
遞迴第一次的資料是3,0 1 1 (*str, state, input)
所以第一次temp是3,呼叫cutString資料是2,0 1 1
第二次temp是2,呼叫cutString資料是0,0 1 1
第三次temp是0,所以return 0
這時候會回到第二次,2後面是0,所以再return 0
這時候再回到上一層,3後面是0,但這時候temp裡面會顯示 錯誤Ptr

我有用另一份資料試過,如果只有兩層,就不會有這個問題,

請問是因為我呼叫太多次,導致strtok會有問題嗎?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.34.54.4
※ 編輯: kent800909 來自: 1.34.54.4 (04/02 00:47)
kent800909:或是請問string二維陣列,我該怎麼拿到單一字元? 04/02 00:48
LPH66:strtok 跟遞迴不怎麼相容... 04/02 00:59
LPH66:主要是 strtok 會記住你上一次傳的字串切到哪了 04/02 00:59
LPH66:當遞迴下去下一層的蓋掉之後回來時就回不來了 04/02 00:59
LPH66:如果硬要用 strtok 的話 就先全部切完存好再遞迴 04/02 01:00
LPH66:要不然就要自己手動切字串了 04/02 01:00
kent800909:我不太知道怎麼切,因為我用string宣告二維陣列, 04/02 01:04
kent800909:所以假設NFAtable[1][1]裡面是 3,0 我該怎麼拿到3? 04/02 01:05
kent800909:不太會切割字串,才只好用strtok… 04/02 01:05
BlazarArc:這樣切最後你要怎麼正確 delete ? 我之前也遇過類似問題 04/02 01:08
BlazarArc:格式這樣的話可以用string::find_first_of(",")來切 04/02 01:10
ledia:用 strtok_r 來存 ptr ? 04/02 11:12

你可能也想看看

搜尋相關網站