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
4214
Владивосток
Таки ж прекрасно! Вы знаете всё, что вам нужно для решения вашей задачи.
Во-первых, вам надо предусмотреть случай отсутствия вообще подстроки в вашей строке. Насколько могу судить, в этом случае ваша программа всё равно выполнит 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
4214
Владивосток
Это, простите, каша какая-то. Попробуйте по шагам. Скажем, подстрока встречается в строке три раза. Что надо сделать? На некоем околоестественном языке, не надо пока ++. Потом из этого можно попробовать сделать программу.

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


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


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

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


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

 Профиль  
                  
 
 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, Супермодераторы



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

Сейчас этот форум просматривают: Google [Bot]


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

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