C/C++

Почему делает неправильно?

Нужно заменить слово can на любое, который пользователь хочет
НО canner не должен менять! но почему код не слушает меня и меняет?
я ему четко сказал "найдешь can, меняй"

Код программы:
#include
#include

using namespace std;
int main()
{
string str1, str3;
cout << "Введи замену" << endl;
getline(cin, str3);
string str2 = "Can you can a can as a canner can can a can";
string can = "can";
while (str2.find(can) != string::npos)
{
auto pos = str2.find(can);
str2.erase(pos, can.size());
str2.insert(pos, str3);
}
can = "Can";
if ((str3[0] > 96) && (str3[0] < 123))
str3[0] -= 32;
while (str2.find(can) != string::npos) {
auto pos = str2.find(can);
str2.erase(pos, can.size());
str2.insert(pos, str3);
}
cout <<"Вывод с заменой\n" <<str2 <<endl;
return 0;
}
Пусть ищет с пробелом "can ", если нет то не меняет

#include < iostream >
#include < string >

using namespace std;
int main()
{
string str1, str3;
cout << "Введи замену" << endl;
getline(cin, str3);
string str2 = "Can you can a can as a canner can can a can";
cout << str2 << endl;
string can = "can "; //ПРОБЕЛ
while (str2.find(can) != string::npos)
{
auto pos = str2.find(can);
str2.erase(pos, can.size());
str2.insert(pos, str3+" "); //Добавляем пробел
}
can = "Can ";
if ((str3[0] > 96) && (str3[0] < 123))
str3[0] -= 32;
while (str2.find(can) != string::npos) {
auto pos = str2.find(can);
str2.erase(pos, can.size());
str2.insert(pos, str3+" ");//Добавляем пробел
}
cout <<"Вывод с заменой\n" <<str2 <<endl;
return 0;
}
Бауржан Алпысбаев
Бауржан Алпысбаев
5 620
Лучший ответ
Александр Кудрявцев проверь вот так #include
#include

using namespace std;

void main()
{
string str1;
cout << "Введи замену" << endl;
char a[]="";
cin >> a;
string str2 = "Can you can a can as a canner can can a can";
string can = "can ";
while (str2.find(can) != string::npos)
{
auto pos = str2.find(can);
str2.erase(pos, can.size());
str2.insert(pos, a);
}
can = "Can";
if ((a[0] > 96) && (a[0] < 123))
a[0] -= 32;
while (str2.find(can) != string::npos) {
auto pos = str2.find(can);
str2.erase(pos, can.size());
str2.insert(pos, a);
}
cout << "Вывод с заменой\n" << str2 << endl;
system("pause");
}
Александр Кудрявцев в строку string can = "can "; поменять на string can = "can";
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
system("chcp 1251 > nul");
string canner = "Can you can a can as a canner can can a can";
auto can = regex("can\\b");
cout << "Введи замену: ";
string word;
cin >> word;
canner = regex_replace(canner, can, word);
cout << canner << '\n';
system("pause > nul");
}
вам помогут регулярые выражения
regexp -- ключевое слово
там такие заменны есть, нужно только прописать оптимальный шаблон замены

прмеры онлайн сайты по тестированию regexp регулярных выражений
пример ваш случай
а ) - https://regexr.com/5dst6
б ) - https://regex101.com/r/EG4Wbj/1
Павел Оранский
Павел Оранский
16 208
а это на каком языке?
Игорь Румынин
Игорь Румынин
3 462
хз
Алексей Дигор не ты не обижайся ща поспрашаю у дрганов!
Алексей Дигор #include
#include

using namespace std;

void main()
{
string str1;
cout << "Введи замену" << endl;
char a[]="";
cin >> a;
string str2 = "Can you can a can as a canner can can a can";
string can = "can ";
while (str2.find(can) != string::npos)
{
auto pos = str2.find(can);
str2.erase(pos, can.size());
str2.insert(pos, a);
}
can = "Can";
if ((a[0] > 96) && (a[0] < 123))
a[0] -= 32;
while (str2.find(can) != string::npos) {
auto pos = str2.find(can);
str2.erase(pos, can.size());
str2.insert(pos, a);
}
cout << "Вывод с заменой\n" << str2 << endl;
system("pause");
}
я попробовал!