Функция, чтобы получить строку слово за словом - PullRequest
1 голос
/ 23 апреля 2020

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

std::string extractWord (std::string& inspectThis)
{
  std::string firstWord;
  int i = 0;

  for (int count = 0; count < inspectThis.length(); count++) {
    if (isalpha(inspectThis[count]))
      firstWord += inspectThis[count];
    else if (firstWord.length() > 0)
      break;
  }
  int pos = inspectThis.find(firstWord);
  inspectThis.erase(pos, pos + firstWord.length());

  return firstWord;
}



int main() {
  std::string name = "   Help  Final  Test";
  std::cout<<extractWord(name) << std::endl;
  std::cout<<extractWord(name) << std::endl;
  std::cout<<extractWord(name) << std::endl;

  return 0;
}

Когда я проверяю свою функцию таким образом, вывод будет: "Help inal est"

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Заголовок этого поста:

Функция для получения строкового слова по слову

Поскольку все это можно сделать одним оператором, отдельная функция не нужно. Все эти многочисленные строки кода могут быть заменены с использованием современных элементов языка C ++ и стандартной библиотеки.

Пожалуйста, см .:

#include <iostream>
#include <string>
#include <regex>
#include <algorithm>
#include <iterator>

std::regex word{ R"(\w+)" };


int main() {

    // The string
    std::string name = "   Help  Final  Test";

    // Copy words to std::cout
    std::copy(std::sregex_token_iterator(name.begin(), name.end(), word), {}, std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}

Из-за простоты программы (одна строка кода Я не очень уверен, что объяснить. Итак, мы используем std::copy, чтобы скопировать что-то между исходной парой итераторов в конечный итератор. Целевым итератором является std::ostream_iterator, который (очень упрощенно) вызывает функцию вставки << для каждого исходного элемента. </p>

Исходным элементом является std::sregex_token_iterater, который был разработан для итерации по элементам в Строка, которая следует определенному шаблону. Шаблон \ w + означает один или несколько буквенных символов.

Если у вас есть вопросы, я с удовольствием отвечу.

0 голосов
/ 23 апреля 2020

Вы можете использовать std :: istringstream и не беспокоиться о количестве пробелов:

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

std::string extractWord(std::string& inspectThis)
{
    std::istringstream strm(inspectThis);
    std::string word;
    std::string first_word;
    while (strm >> word)
    {
        if (isalpha(word[0]))
        {
            // This is the first word
            first_word = word;
            std::string newString;

            // get the rest of the words and reset the inspectThis
            while (strm >> word)
                newString += word + " ";
            inspectThis = newString;
            return first_word;
        }
    }
    return "";
}

int main() 
{
    std::string name = "   Help  Final  Test";
    std::cout << extractWord(name) << std::endl;
    std::cout << extractWord(name) << std::endl;
    std::cout << extractWord(name) << std::endl;
}

Вывод:

Help
Final
Test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...