c++中的字符串标记化会引发seg错误



我想写一个函数,通过标记来分解字符串,到目前为止我得到了以下内容:

#include <cstring>
#include <iostream>
#include <vector>
#define MAXLEN 20
void mytoken(std::string input, std::vector<std::string> & out);
int main() 
{
std::vector<std::string> out;
std::string txt = "XXXXXX-CA";
mytoken(txt, out);
std::cout << "0: " << out[0] <<std::endl;
std::cout << "1: " << out[1] <<std::endl;
}
void mytoken(std::string instr, std::vector<std::string> & out) {
std::vector<std::string> vec;
char input[MAXLEN] = {0};
strcpy(input, instr.c_str());
char *token = std::strtok(input, "-");
while (token != NULL) {
std::cout << token << 'n';
token = std::strtok(NULL, "-");
out.push_back(token);
}    
}

它产生以下输出:

terminate called after throwing an instance of 'std::logic_error'
what():  basic_string::_M_construct null not valid
XXXXXX
CA
bash: line 7: 21987 Aborted                 (core dumped) ./a.out

我想知道为什么。

最好使用'c++-style'函数:它更简单,可读性更强:

#include <sstream>
void mytoken(std::string instr, std::vector<std::string> & out)
{
std::istringstream ss(instr);
std::string token;
while(std::getline(ss, token, '-'))
{
std::cout << token << 'n';
out.push_back(token);
}
}

为了使您的示例正确工作,您需要更改循环中的操作顺序:

//...
while(token != NULL)
{
out.push_back(token);
std::cout << token << 'n';
token = std::strtok(NULL, "-");
}

相关内容

  • 没有找到相关文章

最新更新