получение ошибки шины: 10 с добавлением строки

У меня есть функция, которая принимает две строки и определяет, совпадают ли они. Я пытаюсь токенизировать строку и объединить все токены в одну строку. Это то, что у меня есть до сих пор, и я получаю ошибку шины: 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)

Я знаю, что это довольно глупая функция, но просто пытаюсь отточить свои навыки. любая помощь приветствуется!


person user2196667    schedule 21.02.2014    source источник


Ответы (1)


Есть некоторые вещи, которые вы должны изменить:

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

    c-строки заканчиваются нулем, поэтому вам нужен еще один символ для хранения нулевого символа:

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

    (то же самое для cstr2)

  • strCheck1.append(p1)

    p1 не может быть нулевым указателем (см. Назначение nullptr для std:: строка безопасна? для получения дополнительной информации). Так что надо проверить...

    if (p1) strCheck1.append(p1);

    (то же самое для p2).

  • cout << p1 << endl

    если p1 является нулевым указателем, могут произойти плохие вещи (см. -it">Почему вывод std::cout полностью исчезает после отправки ему NULL). Так что надо проверить...

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

    (то же самое для p2)

  • есть утечка памяти (cstr1/cstr2 надо удалить).

В конце концов, это должно работать.

Вероятно, вам следует рассмотреть другие системы для извлечения токенов (где вам не нужно смешивать std::string и c-string). Например.:

#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;
}
person manlio    schedule 21.02.2014
comment
Большое спасибо. Звучит действительно полезно. Я возьму еще один удар! - person user2196667; 22.02.2014