Помощь - Поиск - Пользователи - Календарь
Полная версия: Удалить из строки s1 все вхождения подстроки s2
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Dmitry25

#include <stdio.h>
#include <string>
int main()
{ setlocale( LC_ALL, "Russian" );
printf("Программа исключает из заданной строки S1 все вхождения заданной подстроки S2.\n\n");
char S1[100] ;
char S2[100] ;
printf("Введите S1: ");
gets(S1);
printf("Введите S2: ");
gets(S2);
printf("\nПреобразованная строка: ");
setlocale( LC_ALL, ".866" );
bool k = true;
for (int i=0; S1[i]!='\0'; i++)
{
k = true;
for (int j=0; S2[j]!='\0'; j++)
{
if (S2[j]!= S1[i + j])
{
k = false;
break;
}
}
if(k == true)
{
i += strlen(S2);
}
printf("%c",S1[i]);
}
printf("\n");
return 0;
}


Добавлено через 12 мин.
вводим s1 привет ветер
s2 ве
получается прит тер
это правильно
но если вводим например s1 каккаккак
s2 как
то выводится как,хотя должна вывестись пустая строчка...
не подскажете в чем дело?
volvo
Цитата
что неверно в коде?
Ну, наверное, то, что из строки ничего не удаляется, и в результате строка S1 остается ровно такой же, какой и была сразу после ввода, ты ж просто печатаешь посимвольно то, что тебя устраивает...

Ну, и коли уж речь о файле <string>, то почему бы не работать с std::string и не решить эту задачу в две строки (исключая ввод данных):
#include <iostream>
#include <string>

int main() {
std::string s1, s2;
std::cout << "Введите S1: "; getline(std::cin, s1);
std::cout << "Введите S2: "; getline(std::cin, s2);
size_t found;

while((found = s1.find(s2)) != std::string::npos)
s1.erase(found, s2.length());

std::cout << s1 << "\n";
return 0;
}
Dmitry25
Цитата
Ну, наверное, то, что из строки ничего не удаляется, и в результате строка S1 остается ровно такой же, какой и была сразу после ввода, ты ж просто печатаешь посимвольно то, что тебя устраивает...

я так и задумал выполнить ее, просто не понимаю,почему она работает неправильно...а в Вашем коде я пока не могу разобраться,т.к. недавно начал заниматься программированием
ammaximus
Ошибки две
1.
   printf("%c",a[i]);
в любом случае должна что-то выводить, согласно твоей программе. Вот она и выводит. Включим ее в условие.

2. У тебя a[i+j], а потом еще и инкрементация в цикле. т.е. указывает на один элемент дальше положенного

Вообщем вот
#include <stdio.h>  
#include <string>
int main()
{
setlocale( LC_ALL, "Russian" );
printf("Iskl 2 to 1\n\n");
char a[100] ;
char b[100] ;
printf("String a: ");
gets(a);
printf("String b: ");
gets(b);
printf("\nTotal: ");
setlocale( LC_ALL, ".866" );
bool k = true;
for (int i=0; a[i]!='\0'; i++)
{
k = true;
for (int j=0; b[j]!='\0'; j++) {
if (b[j]!= a[i + j]){
k = false;
printf("%c",a[i]); //Включим вывод в условие
break;
}
}
if(k == true)
{
i += (strlen(b)-1); //Такие меры могут помочь))

}

}
printf("\n");
return 0;
}

Dmitry25
Спасибо,работает! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.