我正在尝试使用strtok(),但它会给出分段错误。任何人都可以告诉我代码中的问题在哪里,是否有更好的方法来标记除strtok()以外的字符串?
void tokenize(char *tagToFind, char *record, char *delim)
{
char *token;
char *itr;
char *tag;
char *tag5;
int toBreak=0;
token = strtok(record,delim);
while (token != NULL)
{
itr = token;
while (*itr != '{')
{
tag = itr;
itr++;
tag++;
}
tag = '\0';
if ((strcmp(tag, tagToFind) == 0))
break;
else
token = strtok(NULL,delim);
}
if(strcmp(tag5, "tag5") == 0)
{
cout<<"\n\n\n\n\t\ttag5 is present.";
}
}
int main()
{
char *tag = "tag5";
char *record = "tag1{0}|tag2{0}|tag3{0}|tag4{0}|tag5{tag51{0};tag52{0};tag53{0};tag54{0};tag55{tag551{0}:tag552{0}:tag553{0}:tag554{0}:tag555{0}}}";
char *delim = "|";
tokenize(tag, record, delim);
return 0;
}
答案 0 :(得分:3)
char const* const tag = "tag5";
char const* const record = "tag1{0}|tag2{0}|tag3{0}|tag4{0}|tag5{tag51{0};tag52{0};tag53{0};tag54{0};tag55{tag551{0}:tag552{0}:tag553{0}:tag554{0}:tag555{0}}}";
char const delim = '|';
std::stringstream ss(record);
for (std::string token; std::getline(ss, token, delim); ) {
// Handle token here.
}
答案 1 :(得分:1)
由于您在字符串文字上使用strtok
,因此您遇到了段错误。请记住strtok
修改输入字符串(它用0替换分隔符的所有实例),修改字符串文字会导致未定义的行为;在某些平台上(例如你的平台),字符串文字存储在只读内存段中,因此出错。
您的代码需要进行以下更改:
char record[] = "tag1{0}|tag2{0}|tag3{0}|tag4{0}|tag5{tag51{0};tag52{0};tag53{0};tag54{0};tag55{tag551{0}:tag552{0}:tag553{0}:tag554{0}:tag555{0}}}";
而不是record
是指向字符串文字的指针,它现在是一个char
数组,可以由您的代码修改。
说了这么多,如果你使用C ++,Simple的解决方案可能是更好的方法。