获取总线错误:10附加字符串追加

时间:2014-02-21 08:22:15

标签: c++ append strtok

我有一个函数,它接受两个字符串并确定它们是否相同。我试图标记字符串并将所有标记组合成一个字符串。这就是我到目前为止所得到的总线错误:10 任何帮助赞赏。

    #include <iostream>
    #include <string>
    using  namespace std;

    bool stringCheck(string s1, string s2){
    string strCheck1 = "";
    string strCheck2 = "";

    char *cstr1 = new char[s1.length()]; // char array with length of string
    strcpy(cstr1, s1.c_str());  // copies characters of string to char array

    char *cstr2 = new char[s2.length()];
    strcpy(cstr2, s2.c_str());

    char *p1 = strtok(cstr1, " ");  // creates a char array that stores token that 
                                    // is delimeted 
    cout << "p1 " << p1 << endl;    ///outputs token that is found

    strCheck1.append(p1);                       // appends token to string 
    cout << "strCheck1  " << strCheck1 << endl; // outputs string

    while(p1 != NULL)               // while the token is not a null character
    {
        cout<<"parsing" << endl;    
        p1 = strtok(NULL, " ");     // continue to parse current string.  
        cout << "p1 " << p1 << endl; 
        strCheck1.append(p1);
        cout << "str1  " << strCheck1 << endl;
    }

    char * p2 = strtok(cstr2, " ");
    cout << "p2 " << p2 << endl; 
    strCheck2.append(p2);
    cout << "strCheck2  " << strCheck2 << endl;

    while(p2 != null){
        p2 = strtok(NULL, " ");
        strCheck2.append(p2);
        cout << "str2  " << strCheck2 << endl;
    }

    if( strCheck1.compare(strCheck2) != 0)
    {
        return 0;
    }
    else return 1;
}

int main(void){
    string s1 = "jam yoooo jay";
    string s2 = "jam    yoooo";
    if(stringCheck(s1, s2) == 1){
        cout << "strings same"<< endl;;
    }
    else{
        cout << "strings not same" << endl;
    }

}

是否有条件声明我可以配对

while(p1 != NULL)

我知道这是一个非常愚蠢的功能,但只是试图提高我的技能。任何帮助赞赏!

1 个答案:

答案 0 :(得分:0)

你必须改变一些事情:

  • char *cstr1 = new char[s1.length()];

    c-string以null结尾,因此您需要多一个char来存储空字符:

    char *cstr1 = new char[s1.length() + 1];

    cstr2相同)

  • strCheck1.append(p1)

    p1不能是空指针(有关详细信息,请参阅Assign a nullptr to a std::string is safe?)。所以你必须检查......

    if (p1) strCheck1.append(p1);

    p2相同)。

  • cout << p1 << endl

    如果p1是空指针,可能会发生坏事(参见Why does std::cout output disappear completely after NULL is sent to it)。所以你必须检查......

    if (p1) { cout << "p1 " << p1 << endl; strCheck1.append(p1); }

    p2相同)

  • 内存泄漏(cstr1 / cstr2必须删除)。

最后应该有效。

可能你应该考虑其他系统来提取令牌(你不必混合使用std :: string和c-string)。 E.g:

#include <iostream>
#include <string>
#include <sstream>

int main()
{
  std::string text("text-to-tokenize");
  std::istringstream iss(text);
  std::string token;

  while(getline(iss, token, '-'))
    std::cout << token << std::endl;

  return 0;
}