Если вы видите строку «муравей», подставьте в строку слово «термит». - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь заменить все слова "муравей" в тексте удара на "термит" без использования функции замены.Я могу заменить только первое слово в тексте.Может кто-нибудь показать мне, что я сделал не так в своей петле?Спасибо!Ps Также это задание из школы.Я должен кодировать его определенным образом, как того требует мой профессор.

 #include <string>
 #include <iostream>
 using namespace std;

 void HomeworkHeader();

 string Text = "Auntie saw an ant cross the kitchen counter. Then latter she 
 saw a group of ants cross the floor. But, she was focused on adding a new 2 
 meter antenna to her 40 foot antenna mast. Friends would be coming over to 
 help with the raising and lowering of the antenna mast.";

 string FindAndSubstitutes(string bText, string OldWord, string NewWord);

 int main()
 {
      HomeworkHeader();
      cout << Text << endl;
      cout << endl;
      string Revise = FindAndSubstitutes(Text, "ant", "termite");
      cout << Revise;
      return 0;
  }

  string FindAndSubstitutes(string bText, string OldWord, string 
     NewWord)
  {
   int len = Text.length();
    int OldStrLen = OldWord.length();

    for (int i = 0; i < len; i++)
    {
        int WhereIsAnt = Text.find(OldWord);
        string partBefore = Text.substr(0, WhereIsAnt);
        string partAfter = Text.substr( WhereIsAnt + OldStrLen + 1);
        bText = partBefore + NewWord + partAfter;

     }

     return bText;
     }

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Вам нужен цикл до тех пор, пока вы не найдете экземпляры OldWord и не будете копировать подстроки для замены на NewWord, как вы уже это сделали.Ура, надеюсь, это поможет.

#include <string>
#include <iostream>
using namespace std;

void HomeworkHeader();

string Text = "Auntie saw an ant cross the kitchen counter. Then latter she \
saw a group of ants cross the floor. But, she was focused on adding a new 2 \
meter antenna to her 40 foot antenna mast. Friends would be coming over to \
help with the raising and lowering of the antenna mast.";

string FindAndSubstitutes(string bText, string OldWord, string NewWord);

int main()
{
    HomeworkHeader();
    cout << Text << endl;
    cout << endl;
    string Revise = FindAndSubstitutes(Text, "ant", "termite");
    cout << Revise;
    return 0;
}

string FindAndSubstitutes(string Text, string OldWord, string NewWord)
{
    int len = Text.length();
    int OldStrLen = OldWord.length();
    int WhereIsAnt;

    while( (WhereIsAnt = Text.find(OldWord)) >= 0 )
    {
        string partBefore = Text.substr(0, WhereIsAnt);
        string partAfter = Text.substr( WhereIsAnt + OldStrLen);
        Text = partBefore + NewWord + partAfter;
    }

    return Text;
}
0 голосов
/ 23 мая 2018

Для текста, который вы использовали в качестве примера, вы можете сделать это с помощью двух вызовов, чтобы найти и заменить функции (для фиксированных шаблонов), просто найдите " ants " и замените его на " termites ", затем найдите " ant ",затем замените все вхождения на " termite ".Таким образом, вы не будете приводить к изменению "antenna" с "termiteenna", поскольку у вас есть несколько случаев.

Если вы копаете немного с регулярными выражениями и связанными библиотеками, вы можете получить лучший подход, которыйпозволяет ant или ants застрять в знаках препинания (например, ,, . или ?), поэтому подстановка работает и для них.См. regex(3) документация к библиотеке.

0 голосов
/ 20 мая 2018

Есть несколько моментов, которые вы должны рассмотреть, вы использовали Text (глобальную переменную) вместо bText аргумента, и затем вы зацикливаетесь на размере строки, но вместо этого он должен зацикливаться, когда заменять нечего.и самый важный момент, который следует учитывать в вашем алгоритме, это каждый раз, когда вы выполняете поиск с начала, а не с последней найденной позиции.

<iframe height="477px" width="100%" src="https://repl.it/repls/RudeLinedGzip?lite=true" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals"></iframe>
#include <string>
#include <iostream>
using namespace std;


string Text = "Auntie saw an ant cross the kitchen counter. Then latter she\ 
saw a group of ants cross the floor. But, she was focused on adding a new 2 \
meter antenna to her 40 foot antenna mast. Friends would be coming over to \
help with the raising and lowering of the antenna mast.";

string FindAndSubstitutes(string bText, string OldWord, string NewWord);

int main()
{
      cout << Text << endl;
      cout << endl;
      string Revise = FindAndSubstitutes(Text, "ant", "termite");
      cout << Revise << endl;
      return 0;
}

string FindAndSubstitutes(string bText, string OldWord, string NewWord)
{
  int len = Text.length();
  int OldStrLen = OldWord.length();
  size_t WhereIsAnt = bText.find(OldWord, 0);
  while(WhereIsAnt != string::npos)
  {
      string partBefore = bText.substr(0, WhereIsAnt);
      string partAfter = bText.substr( WhereIsAnt + OldStrLen );
      bText = partBefore + NewWord + partAfter;
      WhereIsAnt = bText.find(OldWord,WhereIsAnt+1);
  }
  return bText;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...