我收到來自的strtok和strtrok_r功能意外的行爲使用的strtok/strtok_r:在C++ while循環
queue<string> tks;
char line[1024];
char *savePtr = 0;
while(true)
{
//get input from user store in line
tks.push(strtok_r(line, " \n", &savePtr)); //initial push only works right during first loop
char *p = nullptr;
for (...)
{
p = strtok_r(NULL, " \n", &savePtr);
if (p == NULL)
{
break;
}
tks.push(p);
}
delete p;
savePtr = NULL;
//do stuff, clear out tks before looping again
}
我使用strtok
嘗試,實現了第二循環的過程中,最初的推沒有發生。我嘗試使用可重入版本strtok_r
來控制第二個循環期間保存的指針指向的內容,方法是在再次循環前確保它爲空。
tks
是在第一時間通過循環唯一正確填充 - 後續循環給出不同的結果取決於line
長度缺少什麼我在這裏?
[mcve]或者它沒有發生。 –
重要的有趣的事實:strtok(和strtok_r)不是'new'指針指派給'p'。它接受你放入的字符串'line'並截取它,插入一個空字符來代替下一個找到的分隔符,然後返回一個指向現在以null結尾的字符串的第一個字符的指針。所以'刪除p;'實際上是試圖'刪除'''部分。嘉潮。好。也許不是,因爲你真正刪除的是NULL,因爲循環退出條件。不過,也許不應該這樣做。 – user4581301
需要...這並不影響我的問題,雖然:( – tloveless