[英]Trying to split a char* in C++ using strok,program compiles but crashes
所以我試圖像這樣在C ++中拆分char *:
char* writable = &buffer[0u];
char* test;
test = strtok (writable," ,.-");
while (test != NULL)
{
test = strtok (NULL, " ,.-");
}
使用的緩沖區是我從讀取文件得到的字符串。 如您所見,我使用的定界符是空格。 在編譯時,它立即崩潰。 但是當我嘗試這個:
test = strtok (writable," ,.-");
test = strtok (NULL," ,.-");
test = strtok (NULL," ,.-");
test = strtok (NULL," ,.-");
test = strtok (NULL," ,.-");
test = strtok (NULL," ,.-");
它完成並工作正常。
所有輸出(char *測試)都寫入文件中,以確認什么在工作,什么不在。
您知道為什么會這樣嗎?
避免在C ++代碼中使用strtok()
-它會修改參數字符串。 (您要做的是創建一個指向buffer[]
開頭的指針,因此它仍然會修改您的緩沖區。)
相反,請按照以下方式使用算法:
string s = "string, to, split";
string delimiters = " ,";
size_t current;
size_t next = -1;
do
{
current = next + 1;
next = s.find_first_of( delimiters, current );
cout << s.substr( current, next - current ) << endl;
}
while (next != string::npos);
如果必須使用strtok()
,請確保首先對源字符串進行實際復制。 一個std::vector<char>
在這里派上用場:
std::vector <char> scopy( s.begin(), s.end() );
auto p = std::strtok( scopy.data(), ... );
希望這可以幫助。
當你說:
使用的緩沖區是我從讀取文件中獲得的字符串
我的靈通能力告訴我,您可能已經忘記了使用結尾的null字符來強制終止正確的字符串終止,從而終止了“ buffer”終止。 您絕對應該調查是否是這種情況,因為這可能是導致崩潰的原因。
另外,這一行:
char* writable = &buffer[0u];
一開始,它對我來說可疑,但后來我意識到還可以。 但無論如何,這是更好的形式:
char* writable = buffer;
另外,如果buffer指向或為硬編碼文字字符串,例如buffer = "Some hard coded string";
),則strtok在嘗試寫入該地址時一定會崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.