所以我试图在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)都写入文件以确认哪些有效,哪些无效。
你知道为什么会这样吗?
答案 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在尝试写入该地址时肯定会崩溃。