Замена слова в позиции X строки C ++ - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь написать в программе функцию, которая будет принимать строку, слово и целое число и использовать int в качестве значения индекса, а слово в качестве значения замены.Например, если строка «Это тест», слово «пример» и число 4, то результатом будет «Это пример».Это то, что у меня есть (я должен был сделать несколько копий строки, потому что в конце концов я собираюсь передать ее в две другие функции по ссылке, а не по значению). Сейчас он использует индекс символа вместо слова.Индекс для того, чтобы заменить.Как мне это исправить?

#include "pch.h"
#include<iostream>
#include<string>
#include<sstream>

using namespace std;

int main()
{
string Input = "";
string Word = "";
int Number = 0;

cout << "Pleas enter a string using only lower case letters. \n";
getline(cin, Input);

cout << "Please enter a word using only lower case lettersS. \n";
getline(cin, Word);

cout << "Please enter a number. \n";
cin >> Number;

string StringCopy1 = Input;
string StringCopy2 = Input;
string StringCopy3 = Input;
 }

 void stringFunctionValue(string StringCopy1, int Number, string Word) 
{
  StringCopy1.replace(Number, Word.length, Word);
  return StringCopy1;
 }

1 Ответ

0 голосов
/ 02 октября 2018

Первое, что вам нужно сделать, это найти n-е слово.

Первое, что приходит на ум, это использование std::istringstream, чтобы отделить строку с помощью >> и std::ostringstream, чтобы написать новую строку.

std::istringstream in(StringCopy1);
std::string token;
std::ostringstream out;
int count = 0;
while (in >> token) // while we can get more tokens
{
    if (++count != number) // not the number of the token to replace
    {
        out << token << " "; // write the token
    }
    else
    {
        out << word << " "; // write the replacement word
    }
}
return out.str();

Хотя это легко написать, у него есть две проблемы: он теряет правильный тип пробела в string И помещает дополнительный пробел в конце строки.Это также довольно медленно и использует намного больше памяти, чем если вы измените строку на месте.

Используйте std::string::find_first_not_of, чтобы найти первый непробельный символ.Это будет начало первого слова.Затем используйте std::string::find_first_of, чтобы найти следующий пробельный символ.Это будет конец слова.Чередуйте взад и вперед, находя не пробелы, затем пробелы, пока не найдете начало и конец n-го слова.std::string::replace это слово.Этот подход требует от вас написания все более сложного кода, но гораздо более удовлетворительным.Вот почему я обрисовал его, а не реализовал полностью: чтобы вы были довольны собой.

Примечание: void stringFunctionValue(string StringCopy1, int Number, string Word) не дает возможности вернуть результат пользователю.Это делает для бесполезной функции.Попробуйте вернуть string вместо void.

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