2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Удаление подстроки [C++]
Сообщение23.11.2013, 22:16 


23/10/13
46
Здравствуйте. Подскажите пожалуйста что нужно исправить в проге, чтобы она стала решением данной задачи: Даны строки S1 и S2. Удалить из строки S1 последнюю подстроку, совпадающую с S2. Если совпадающих подстрок нет, то вывести строку S без изменений. У меня удаляется первая, а не последняя подстрока(C++):
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>

void main()
{
   char s1[256], s2[256];
   char *buf;
   int i,j;

   printf("Введите строку 1: ");
   gets(s1);
   printf("Введите строку 2: ");
   gets(s2);
   buf = strstr(s1, s2);
   strcpy(buf,buf+strlen(s2));
   printf("%s\n", s1);
   _getch();
}

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение23.11.2013, 23:11 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Так функция strstr и ищет первое вхождение. Нет ли функции для последнего вхождения?
Попробуйте в цикле или всё наоборот.

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение23.11.2013, 23:33 
Заслуженный участник


09/09/10
3729
С++? Так чего ж вы мучаетесь?

Код:
#include <string>
#include <iostream>
#include <algorithm>

int main()
{
   std::string s1, s2;

   std::cout << "Введите строку 1: ";
   std::cin >> s1;
   std::cout << "Введите строку 2: ";
   std::cin >> s2;

   if (!s2.empty()) {
      std::string::const_iterator sub = std::find_end(s1.begin(), s1.end(), s2.begin(), s2.end());
      if (sub != s1.end()) {
         s1.erase(sub, sub + s2.size());
      }
   }

   std::cout << s1 << std::endl;
}

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение23.11.2013, 23:56 


23/10/13
46
Joker_vD в сообщении #791887 писал(а):
С++? Так чего ж вы мучаетесь?

Код:
#include <string>
#include <iostream>
#include <algorithm>

int main()
{
   std::string s1, s2;

   std::cout << "Введите строку 1: ";
   std::cin >> s1;
   std::cout << "Введите строку 2: ";
   std::cin >> s2;

   if (!s2.empty()) {
      std::string::const_iterator sub = std::find_end(s1.begin(), s1.end(), s2.begin(), s2.end());
      if (sub != s1.end()) {
         s1.erase(sub, sub + s2.size());
      }
   }

   std::cout << s1 << std::endl;
}


К сожалению "cout", "std" и другие операции из iostream мне не известны, не могли бы Вы расписать через "мои" библиотеки? Просто до такого уровня я не дошёл ещё

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 00:09 
Заслуженный участник


28/04/09
1933
Зачем <algorithm> приплетать? Если можно пользоваться классом std::string, то в нем есть функция rfind, у которой имеется перегрузка, отвечающая за поиск последнего вхождения подстроки.
Если ТС требуется решение все-таки на чистом C, то в его стандартной библиотеке подходящей функции вроде бы нет.

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 00:15 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли

(Оффтоп)

Retard в сообщении #791892 писал(а):
К сожалению "cout", "std" и другие операции из iostream мне не известны
Это ж первое, что проходят. Ещё перед printf и прочим таким. Хотя, смотря где, конечно.

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 01:10 


23/10/13
46
Aritaborian в сообщении #791899 писал(а):

(Оффтоп)

Retard в сообщении #791892 писал(а):
К сожалению "cout", "std" и другие операции из iostream мне не известны
Это ж первое, что проходят. Ещё перед printf и прочим таким. Хотя, смотря где, конечно.


(Оффтоп)

Как ни странно, мы прошли условия, циклы, массивы, дошли до строк, но мы работаем без этих операций пока что

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 03:03 
Заслуженный участник


16/02/13
4197
Владивосток
Таки ж прекрасно! Вы знаете всё, что вам нужно для решения вашей задачи.
Во-первых, вам надо предусмотреть случай отсутствия вообще подстроки в вашей строке. Насколько могу судить, в этом случае ваша программа всё равно выполнит strcpy, только вот buf будет нулевым. Это либо вызовет крах программы из-за попытки доступа к нулевому адресу, либо, если strcpy нынче умная, нет — но в любом случае некошерно.
Во-вторых, вам надо написать цикл — нашли подстроку, запомнили адрес, ищем дальше, и так пока в остатке не будет подстроки. Тогда запомненный адрес будет тем, что нам нужен.

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 12:27 


23/10/13
46
iifat в сообщении #791934 писал(а):
Таки ж прекрасно! Вы знаете всё, что вам нужно для решения вашей задачи.
Во-первых, вам надо предусмотреть случай отсутствия вообще подстроки в вашей строке. Насколько могу судить, в этом случае ваша программа всё равно выполнит strcpy, только вот buf будет нулевым. Это либо вызовет крах программы из-за попытки доступа к нулевому адресу, либо, если strcpy нынче умная, нет — но в любом случае некошерно.
Во-вторых, вам надо написать цикл — нашли подстроку, запомнили адрес, ищем дальше, и так пока в остатке не будет подстроки. Тогда запомненный адрес будет тем, что нам нужен.


Получается цикл выглядит так?

Код:
buf = strstr(s1, s2);
for (i=0; i<strlen(s2); i++)
         for (j = 0; j < strlen(s1); j++)
            buf[j] = buf[j+1];

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 13:18 
Заслуженный участник


16/02/13
4197
Владивосток
Это, простите, каша какая-то. Попробуйте по шагам. Скажем, подстрока встречается в строке три раза. Что надо сделать? На некоем околоестественном языке, не надо пока ++. Потом из этого можно попробовать сделать программу.

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 13:31 


23/10/13
46
iifat в сообщении #792026 писал(а):
Это, простите, каша какая-то. Попробуйте по шагам. Скажем, подстрока встречается в строке три раза. Что надо сделать? На некоем околоестественном языке, не надо пока ++. Потом из этого можно попробовать сделать программу.


Ну, нужно ввести цикл, в котором, когда счётчик будет равен трём, нужно удалить подстроку, то есть скопировать все символы до этой подстроки и после, правильно?

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 13:52 
Заслуженный участник


16/02/13
4197
Владивосток
Конечно, правильно!
Только подробнее надо. Вам же это потом компилятору объяснить, а он, да простят меня Правила, тупой!

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 14:32 


23/10/13
46
iifat в сообщении #792053 писал(а):
Конечно, правильно!
Только подробнее надо. Вам же это потом компилятору объяснить, а он, да простят меня Правила, тупой!


Даже не знаю как подробнее. Может что-то вроде этого: указателю присваиваем функцию первого вхождения подстроки. Затем, если вхождение найдено, то вводим цикл, где пока счётчик меньше трёх, ничего не делать. Когда счётчик = 3 скопировать все символы до этой подстроки и после, затем вывести результат.
Что-то я плохо соображаю.

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 14:45 
Заслуженный участник
Аватара пользователя


13/08/08
14495
А попробуйте всё же мой второй совет, хотя бы в качестве забавы. Если у Вас всё нормально с вырезанием первого вхождения, то нетрудно последнее превратить в первое. :-)

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение24.11.2013, 14:52 


23/10/13
46
gris в сообщении #792079 писал(а):
А попробуйте всё же мой второй совет, хотя бы в качестве забавы. Если у Вас всё нормально с вырезанием первого вхождения, то нетрудно последнее превратить в первое. :-)


Самое забавное, что именно это я и не знаю как сделать. Звучит, наверное, странно, но это так.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group