2014-02-05 92 views
0

我正在尝试使用strtok(),但它给出了分段错误。任何人都可以告诉我代码中的问题在哪里,并且有没有更好的方法来标记strtok()以外的字符串?在C++中标记字符串的最佳方法是什么?

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

http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c – sujin

+2

这是C还是C++?如果是后者,那么你应该检查std :: string – olevegard

+0

分段错误是因为你正在修改'record'指向的字符串文字。 'strtok()'修改第一个参数读取[strtok导致段错误,但不通过代码时](http://stackoverflow.com/questions/17551665/strtok-causing-segfault-but-not-when-step-through-code/17551779#17551779) –

回答

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. 
} 

Example here

+0

非常感谢这个例子。 – Mariners

+0

@Mariners应该点击右边如果接受这个答案,*不*忘记阅读@ [JohnBode的答案](http://stackoverflow.com/a/21578521/1673391)。 –

1

由于您在字符串文字上使用strtok,您正在收到段错误。请记住strtok修改输入字符串(它用0代替分隔符的所有实例),修改字符串会导致未定义的行为;在某些平台上(比如你的显然),字符串文本存储在只读内存段中,因此出现错误。

您的代码shouid有以下变化工作:

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的解决方案可能是更好的方法。

相关问题