尝试使用strok在C ++中拆分char *,程序编译但崩溃

时间:2015-11-15 18:43:01

标签: c++ string char

所以我试图在C ++中拆分char *,如下所示:

WebClient wc = new WebClient();
wc.DownloadFileCompleted += (sender, e) =>
{
    wc.Dispose();
};
wc.DownloadFileAsync(urlUri, outputFile);
SomeMethod1();
SomeMethod2();

使用的缓冲区是我从读取文件中获得的字符串。 正如您所看到的,我使用的分隔符是空格。 在编译时,它会立即崩溃。 但是当我尝试这个时:

char* writable = &buffer[0u];
char* test;
test = strtok (writable," ,.-");
while (test != NULL)
        {
                test = strtok (NULL, " ,.-");
        }

它编译并且工作得很好。

所有输出(char * test)都写入文件以确认哪些有效,哪些无效。

你知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

避免在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(), ... );

希望这有帮助。

答案 1 :(得分:0)

当你说:

  

使用的缓冲区是我从阅读文件

获得的字符串

我的精神力量开始并且告诉我你可能忘记了使用尾随空字符来终止“缓冲区”以强制正确的字符串终止。你肯定应该调查是否是这种情况,因为这可能是你崩溃的原因。

此外,这一行:

char* writable = &buffer[0u];

起初,它看起来很可疑,但后来我意识到这没关系。但无论如何,这是更好的形式:

char* writable = buffer;

此外,如果缓冲区指向或是硬编码的文字字符串,例如buffer = "Some hard coded string";),strtok在尝试写入该地址时肯定会崩溃。