2014 dxdy logo

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

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




На страницу Пред.  1, 2
 
 Re: Удаление подстроки
Сообщение24.11.2013, 15:08 
Аватара пользователя
Ну смотрите:
$17337348922027384338733455$ и $73$
strstr вернёт нам позицию первого вхождения — $2$
Но нам-то нужно последнее вхождение. А что если посмотреть сзади тем же strstr? Он даст нам $5$, но с конца. Если слегка изменить две строки, то можно это получить.

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

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

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

 
 
 
 Re: Удаление подстроки
Сообщение24.11.2013, 15:12 
Аватара пользователя
Да, как раз проходить в обратном порядке. Но как это сделать, не спускаясь до посимвольного сравнения и используя уже работающий кусок кода? Изменить строки.

 
 
 
 Re: Удаление подстроки
Сообщение24.11.2013, 15:15 
Retard в сообщении #792072 писал(а):
вводим цикл, где пока счётчик меньше трёх, ничего не делать
Ви таки будете смеяться, но если в цикле ничего не делать, то ничего и не сделается :shock:

-- 24.11.2013, 23:18 --

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

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

 
 
 
 Re: Удаление подстроки
Сообщение24.11.2013, 15:56 
Подскажите, чем заменяется copy из Паскаля в в языке Си? strncpy же?

 
 
 
 Re: Удаление подстроки
Сообщение24.11.2013, 16:02 
Аватара пользователя
Я, наверное, с PHP перепутал. Там есть команда strrev переворачивания строки. Впрочем, там есть и команда нахождения последнего вхождения.
Впрочем, я это всё к тому, что кроме хорошего знания библиотек хорошо ещё и алгоритмически представлять процессы. А может быть этого и не нужно, ведь библиотеки для того и разрабатываются, чтобы не спускаться вниз. На практике часто предзнание особенностей (даже статистических) входной информации позволяет выбирать наиболее эффективные варианты алгоритма (кода) из возможных.

 
 
 
 Re: Удаление подстроки
Сообщение24.11.2013, 16:11 
Хм, я сделал программу, и она вроде как даже работает... Осталось, наверное, немного подправить
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 
Похоже на правду. Работает? strrev я у себя тоже не нашёл, но я на Цэ не пишу, что установилось, то установилось.

 
 
 
 Re: Удаление подстроки
Сообщение25.11.2013, 11:57 
iifat в сообщении #792372 писал(а):
Похоже на правду. Работает? strrev я у себя тоже не нашёл, но я на Цэ не пишу, что установилось, то установилось.


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

 
 
 [ Сообщений: 25 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group