Попытка заменить слова в строке - PullRequest
2 голосов
/ 29 января 2012

Я пытаюсь взять слова из вывода и найти любое слово с буквой Q в нем. Если слово имеет, его нужно заменить словом «плохо». После этого я пытаюсь добавить каждое слово в output2. У меня проблемы с этим. Ошибка, которую я получаю при компиляции:

недопустимое преобразование из 'const char *' в 'char' [-fpermissive]

#include <iostream>
#include <string>
#include <cstdlib>
#include <sstream>
using namespace std;
string manipulate(string x);
int main(int argc, char* argv[])
{
string input, temp, output, output2, test, test2;
int b;
cout << "Enter a string: ";
getline(cin, input);
istringstream iss(input);
while (iss >> test)
{  
      if(test.length() != 3)
      {
        test.append(" ", 1);   
        output.append(test);
      }
}

istringstream iss2(output);
while (iss2 >> test2)
{
      for(int i = 0; i<test2.length(); i++) 
   {
     switch(test2[i])
      {
           case 'q':
           test2[1]="bad";
           output2.append(test2);
           break;
      }

   }
}
cout << "Your orginal string was: " << input << endl;
cout << "Your new string is: " << output2 << endl;
cin.get();
return 0;
}

Ответы [ 2 ]

12 голосов
/ 29 января 2012

Есть гораздо более простой способ, как это сделать:

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

int main()
{
    string s("Your homework is bad. Really bad.");

    while (s.find("bad") != string::npos)
        s.replace(s.find("bad"), 3, "good");

    cout << s << endl;

    return 0;
}

output:

Your homework is good. Really good.

Вот пример без вызова find больше раз, чем нам нужно:

    size_t index;
    while ((index = s.find("bad")) != string::npos)
        s.replace(index, 3, "good");

Хотя первый легче читать.

1 голос
/ 29 января 2012

Это причина ошибки компиляции:

test2[1]="bad";

test2[1] относится к типу char, а "bad" относится к типу const char*: это присвоение недопустимо.

Используйте std::string::replace(), чтобы изменить q на "bad":

test2.replace(i, 1, "bad");

Поскольку вам также требуется только заменить первое вхождение 'q' (я думаю, это основано на логике в цикле for), вы можете заменить цикл for на:

size_t q_idx = test2.find('q');
if (std::string::npos != q_idx)
{
    test2.replace(q_idx, 1, "bad");
    output2.append(test2);
}

EDIT:

Для замены всего слова:

test2 = "bad";

Обратите внимание, что output2 будет содержать слова, если они содержат 'q' с текущей логикой. Это будет один из способов исправить это:

output2.append(std::string::npos != test2.find('q') ? "bad" : test2);
...