Извлечение слов из строки - деликатная проблема - PullRequest
1 голос
/ 07 апреля 2019

Мне нужна помощь в извлечении слов из строки в C ++.В определении упражнения, которое я пытаюсь выполнить, слово - это любая последовательность букв и цифр, которая ограничена символами, которые не являются буквами или цифрами (например, взаимозаменяемость, пробелы и т. Д.) .Например:

This.Is.a.String 

моя программа должна создать вектор строк, где элементами вектора будут отдельные слова из упомянутой строки, в данном случае «This», «Is», «a», "String".

Я попытался перебрать заданную строку с помощью цикла for и проверить условие, что всякий раз, когда символ, в котором мы сейчас находимся, равен (по значению ASCII) чему-либо между A и Z (aи z) и цифры 0 и 9, поместите его в строку.Затем поместите эту строку в вектор и измените размер строки на 0 (чтобы мы могли добавить другое слово). Это, похоже, не работает ...

vector<string> Function(string s) {
    char letter;
    string r;
    vector<string> vector_string;
     for(int i=0; i<s.length(); i++) {
        letter=toupper(s.at(i));  // I do this so all letters are capital letters, so it's easier to compare them
        r.resize(0);
   while((letter>=65 || letter<=90) && (letter>=48 || letter<=57)) {

        r.push_back(s.at(i));

    }
        vector_string.push_back(r);




}

 return vector_string;
  }

PS Я очень новичок в C ++.Я знаю, что это не близко к решению, но я должен был начать где-то.Я был бы очень признателен, если бы кто-нибудь из вас мог помочь мне с тем, что здесь делать!Это немного расстраивает.

Спасибо и извините, что нашли время!

1 Ответ

1 голос
/ 07 апреля 2019

У вас есть бесконечный цикл while.И его состояние не является правильным.

Здесь улучшение:

vector<string> split(string s) {
    char letter;
    vector<string> vector_string;

    for(int i=0; i<s.length(); ) {
        if (isalnum(s[i])) {
            string r; 
            do {  
               r.push_back(s[i++]);
            } while(i<s.length() && isalnum(s[i]));
            vector_string.push_back(r);
        }
        else i++; 
    }
    return vector_string;
}

Онлайн-демонстрация

В этой пересмотренной версии используется предопределенный isalnum() для принятиябуквенно-цифровые символы в словах.

Для написания более ясных условий, как правило, предпочитают использовать предикаты классификации символов стандарта в <cctype> или лучше, их аналогах с поддержкой локали ,

Редактировать: А если бы вы могли использовать регулярные выражения?

Не уверен, что вам разрешено, но вот как будет выглядеть код:

vector<string> split(string s) {
    regex word_definition("([a-zA-Z0-9]+)");
    auto words_begin = sregex_iterator(s.begin(), s.end(), word_definition);
    auto words_end = sregex_iterator();

    vector<string> vector_string;
    for(auto i = words_begin; i!=words_end; i++) {
        vector_string.push_back(i->str());
    }
    return vector_string;
}
...