gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:58:27 26 4
gpt4 key购买 nike

所以我想像这样在 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* 测试)都写入文件以确认哪些有效,哪些无效。

你知道为什么会这样吗?

最佳答案

避免使用 strtok()在 C++ 代码中——它修改参数字符串。 (您所做的是创建一个指向您的 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(), ... );

希望这对您有所帮助。

关于c++ - 尝试使用 strok 在 C++ 中拆分 char*,程序编译但崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33723480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com