Переход от одного экземпляра string.find к следующему - PullRequest
4 голосов
/ 02 августа 2020

Ну, это еще одна классическая c головоломка ... Моя цель - взять первую букву каждого слова в строке и поместить ее в конец этого слова, добавив -ay (Свинья на латыни). Мне удалось преобразовать первое слово. Но как мне перейти к следующему? Я проконсультировался с разными источниками, на форумах, но все еще застрял ... Какие-нибудь советы? :) Может что-то вроде: pos = a.find ("", pos +1) ? См. Код ниже:

#include <iostream>
#include <string>


int main()

{
    std::string a = "hello what is going on";
    std::string b = "ay ";
    std::size_t pos = a.find(" ");
    int length = a.length();
    std::string first = a.substr(0,1);

        for (int i = 0; i <= length; i++)
        {   
            if (pos != std::string::npos)
                {
                a.replace(pos, a.length(), first + b);   //I guess I have to change sth. here.
                }                                        //Maybe a while-loop?
        }

    a.replace(0, 1, "");
    std::cout << a;            //Output: "ellohay"; **goal**: "ellohay hatway siay oingay noay"
    
}

Ответы [ 4 ]

3 голосов
/ 02 августа 2020

Как это часто бывает с задачами манипулирования строками, намного проще хранить отдельные строки «источника» и «назначения», чем пытаться изменять одну строку «на лету».

В вашем случае следующая функция PigLatin выполняет то, что вы просите (хотя я здесь не пытаюсь проверить ваше определение Pig Latin). Он также обрабатывает несколько пробелов между словами и имеет кодовый блок для обработки символов, которые не являются буквами или пробелами, которые вы можете изменить по своему усмотрению. или объяснение.

1 голос
/ 03 августа 2020

Вот простой способ сделать то, что вы хотите, используя стандартные алгоритмы:

std::ostringstream result;  // to store the result

std::istringstream iss{a};  // convert string to stream

std::transform(std::istream_iterator<std::string>{iss}, 
               std::istream_iterator<std::string>{},    
               std::ostream_iterator<std::string>{result},
               [&b](auto const &word) {
                   return word.substr(1) + word[0] + b;   // pig latin
               });

std::cout << result.str();  // convert output stream to string             

Вот демонстрация .

1 голос
/ 02 августа 2020

Это довольно просто:

Просто разметьте строку, возьмите каждый токен, сохраните первый символ токена в некоторой переменной, удалите первый символ и создайте то, что вам нужно.

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

using namespace std;

int main() {
  // build istringstream object from provided text
  auto input = istringstream{"hello what is going on"};

  string token = "";
  string output = "";

  // tokenize provided text input
  while(input >> token) {
    char first = token[0]; // save the first char of token
    token.erase(0, 1); // remove the first char from token
    output = output + token + first + "ay" + " "; // build what you need
  }

  // okay, print output to check if everything is okay
  cout << output << endl;
  
  return 0;
}

И вывод:

ellohay hatway siay oinggay noay

[PS]: не стесняйтесь спрашивать, если у вас есть какие-либо вопросы относительно этого кода / метода решения.

0 голосов
/ 03 августа 2020

Хорошо, благодаря вам всем я придумал некую «смешанную» реализацию ваших идей, например:

#include <iostream>
#include <string>


int main()

{
    std::string a = "hello what is going on";
    std::string b = "ay ";
    std::string c = "ay";
    std::string delimiter = " ";
    std::size_t pos = 0;
    std::string token;
    std::string output = "";
    

    while ((pos = a.find(delimiter)) != std::string::npos)
    {
        token = a.substr(0, pos);
        char first = token[0];
        token.replace(pos, token.length(), first + b);
        token.erase(0, 1);
        std::cout << token << std::endl;
        a.erase(0, pos + delimiter.length());
    }
    char firstA = a[0];
    a.erase(0, 1);
    
    std::cout << a + firstA + c  << std::endl;
}

Не уверен, что продвинутые программисты не одобрят это решение .. . Еще раз: большое спасибо !!

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