2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Удаление подстроки
Сообщение24.11.2013, 15:08 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Ну смотрите:
$17337348922027384338733455$ и $73$
strstr вернёт нам позицию первого вхождения — $2$
Но нам-то нужно последнее вхождение. А что если посмотреть сзади тем же strstr? Он даст нам $5$, но с конца. Если слегка изменить две строки, то можно это получить.

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


27/04/09
28128
Retard в сообщении #792085 писал(а):
Самое забавное, что именно это я и не знаю как сделать.
gris очень воздушно намекнул вот этим:
gris в сообщении #791882 писал(а):
или всё наоборот
на прохождение строк в обратном порядке. (UPD: Как оказалось, не совсем на это. Но проходить строки в обратном порядке тоже можно!)

Retard в сообщении #792085 писал(а):
Звучит, наверное, странно
Очень странно, вы правы.

Вообще, если вы хотите с циклом, и у вас не получается — не лепите в одну кучу. Напишите функцию, которая ищет первое вхождение, начиная с заданного (индексом или указателем) места строки. А потом вызывайте в цикле её — тогда будет трудно испольовать её неправильно, потому что к её коду нет доступа рукам. Уже потом можно будет «развернуть» её вызов, если нужна будет оптимизация.

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


13/08/08
14495
Да, как раз проходить в обратном порядке. Но как это сделать, не спускаясь до посимвольного сравнения и используя уже работающий кусок кода? Изменить строки.

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


16/02/13
4195
Владивосток
Retard в сообщении #792072 писал(а):
вводим цикл, где пока счётчик меньше трёх, ничего не делать
Ви таки будете смеяться, но если в цикле ничего не делать, то ничего и не сделается :shock:

-- 24.11.2013, 23:18 --

gris в сообщении #792101 писал(а):
Но как это сделать, не спускаясь до посимвольного сравнения и используя уже работающий кусок кода? Изменить строки
Кстати, вариант. Примерно как в анекдоте про математика и кипячение воды в чайнике. Вот только не нашёл в стандартной библиотеке функцию, на которую вы намекаете. Возможно, плохо искал, или не там. А без неё таки придётся опуститься до посимвольной обработке, чего бы не хотелось.

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


28/04/09
1933
iifat в сообщении #792103 писал(а):
Вот только не нашёл в стандартной библиотеке функцию, на которую вы намекаете. Возможно, плохо искал, или не там.
Видимо, не там. В <algorithm> есть функция reverse, которая работает с чем угодно (и с контейнерами, и со строками std::string, и с массивами, в т.ч. char*).

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


23/10/13
46
Подскажите, чем заменяется copy из Паскаля в в языке Си? strncpy же?

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


13/08/08
14495
Я, наверное, с PHP перепутал. Там есть команда strrev переворачивания строки. Впрочем, там есть и команда нахождения последнего вхождения.
Впрочем, я это всё к тому, что кроме хорошего знания библиотек хорошо ещё и алгоритмически представлять процессы. А может быть этого и не нужно, ведь библиотеки для того и разрабатываются, чтобы не спускаться вниз. На практике часто предзнание особенностей (даже статистических) входной информации позволяет выбирать наиболее эффективные варианты алгоритма (кода) из возможных.

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


23/10/13
46
Хм, я сделал программу, и она вроде как даже работает... Осталось, наверное, немного подправить
UPD: таки доработал. Правильно?
Код:
#include <string.h>
#include <conio.h>
#include <iostream>

void main()
{
   setlocale(LC_CTYPE,"Russian");
   char s1[256], s2[256];
   char *buf;
   unsigned int i,j;

   printf("Введите строку 1: ");
   gets(s1);
   printf("Введите строку 2: ");
   gets(s2);
   i=strlen(s1)-strlen(s2)+1;
   if (i>0)
   {
   strrev(s1);
   strrev(s2);
   buf = strstr(s1, s2);
   if(buf)
   {
      strcpy(buf,buf+strlen(s2));
      strrev(s1);
   }
   else
     strrev(s1);
   printf("%s\n", s1);
   }
   else
      printf ("\n Строка s2 больше строки s1");
   _getch();
}

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


16/02/13
4195
Владивосток
Похоже на правду. Работает? strrev я у себя тоже не нашёл, но я на Цэ не пишу, что установилось, то установилось.

 Профиль  
                  
 
 Re: Удаление подстроки
Сообщение25.11.2013, 11:57 


23/10/13
46
iifat в сообщении #792372 писал(а):
Похоже на правду. Работает? strrev я у себя тоже не нашёл, но я на Цэ не пишу, что установилось, то установилось.


Да, работает, всё хорошо. Спасибо всем

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

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



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

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


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

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