簡體   English   中英

嘗試使用strok在C ++中拆分char *,程序編譯但崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM