Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > HEEEEELP !


Автор: n00dless 15.9.2004, 19:41
#include <help_me.h> qstn.gif
респект ;
люди, я только начинаю кодить на C++, посему прошу не кричать, что я задаю идиотские вопросы smile.gif
вопрос:
допустим, пользователь вводит строку "ывфывфываважноесловоыфаф".
каким образом мне сделать проверку на наличие в строке подстроки "важноеслово" ?
пытался работа с классами cstring и sstring, но там все очень мутно и непонятно. sad.gif
падскажите пжалста, если можно ввиде исходника, желательно, используя стандартные операторы smile.gif
здесь бываю редко, если не трудно, ответте по e-mail плиzzz: [email protected]
заранее признателен, n00dless wink.gif

Автор: Дрон 15.9.2004, 19:49
Цитата(n00dless @ 15.9.2004, 20:41)
что я задаю идиотские вопросы

Вопрос-то может и не глупый, но правила форума ты нарушаешь.

1) Заголовок сообщения должен кратко отражать суть проблемы, нельзя давать заголовки типа "Помогите", "Срочно нужна помощь", "Есть вопрос", "Очень надо", "Сложный вопрос по программированию" и тому подобное.

Автор: Pakshin A. S. 15.9.2004, 22:43
Класс string содержит несколько функций-членов, предназначенных для поиска подстрок, в частности функции find() и rfind().
Код

size_type find(const string &strob, size_type start=0) const;
size_type rfind(const string &strob, size_type start=npos) const;

Пример:
Код

#include <string>

...

string s = 'asdf';
int i;

i = s.find('as');
if (i != string::npos)
{
// find
}

Автор: Coocky 15.9.2004, 22:53
Исходник не дам(сам сделай, иначе не научишься программировать wink.gif )
Итак получай алгоритм:
Подсчитай количество букв в слове[ b]важноеслово[/b] Это будет критерием проверки на совпадение.Затем проверяй (в цикле ) каждую букву,из веденной пользователем,с буквой своего
слова.Если совпало продолжай цикл,плюсуя заранее подготовленую переменную.И когда значение переменой совпадет с количеством букв слова важноеслово ,выходи из цикла.Такое слово есть.Не забывай при не совпадении сбрасывать переменую на ноль.Иди дальше.Если в конце цикла переменная меньше кол-ва букв,такого слова нет.
Ну уж если не разобрался,напишу код.Помогу и c СString.Но пробуй сам smile.gif
О,пока писал уже код кинули.Но это код CString.А ты просил
Цитата
падскажите пжалста, если можно ввиде исходника, желательно, используя стандартные операторы

Автор: Конструктор 16.9.2004, 08:50
Заголовок
string.h

Прототип
char *strstr(const char *s1, const char *s2);

Описание
Сканирует строку на присутсвие заданной подстроки.
strstr сканирует s1 до первого нахождения строки s2.

Возвращаемые значения
strstr возвращает указатель в строке s1, где начинается s2 . Если s2 не встречается в s1, strstr возвращает NULL.

Копирайт C Runtime Library Reference - BCB6

Автор: mr.DUDA 16.9.2004, 11:02
Модератор: Название темы должно отражать ее суть!

P.S.
Цитата
Копирайт C Runtime Library Reference - BCB6

strstr есть и в VC++, и в gcc, и в Watcom tounge.gif

Автор: Конструктор 16.9.2004, 11:30
Цитата(mr @ 16.9.2004, 12:02)
strstr есть и в VC++, и в gcc, и в Watcom


Я подразумевал копирайт на текст, ибо закопипастил его оттуда (справка с BCB6) и немножко перевел smile.gif

Автор: LuckLess 16.9.2004, 12:00
Бегать по текчту и сравнивать посимвольно , это слишком напряжно... проще:

Код

struct mytxt{
char text[]={/*сюда пиши подстроку , которую ищеш*/}
}zaza;

char input[];
int i;

input="text";//в котором ты исщеш строку.

i=sizeof(input)-sizeof(zaza)+1
//тут  лежит  сколько подстрок длинни zaza может уместиться в строке длинны input;

for (;i>0;i--){
if (  *((struct mytxt*)&input+i)==zaza) printf("YUPPI") , break;
}


код не проверял , но думаю идея понятна.

Автор: Конструктор 16.9.2004, 12:27
1. char text[]={/*сюда пиши подстроку , которую ищеш*/}
В С нельзя инициализировать члены структур и классов таким образом!

2. char input[];
В С нельзя создавать динамические массивы таким образом. Размер этого массива будет неизвестен!

3. input="text";//в котором ты исщеш строку.
В С нельзя таким образом присваивать строки строковым массивам!

4. код не проверял
Это код не откомпилируется никогда!

5. но думаю идея понятна.
Если честно идея совершенно не понятна, а если я понял правильно, то ИМХО идея не верна!

sorry sad.gif

Автор: LuckLess 16.9.2004, 12:45
Цитата
1. char text[]={/*сюда пиши подстроку , которую ищеш*/} В С нельзя инициализировать члены структур и классов таким образом!


ты наверно не допонял. я обЪяснял зачем нужно это поле структуры, вот и вся.



Цитата
3. input="text";//в котором ты исщеш строку. В С нельзя таким образом присваивать строки строковым массивам!

Цитата
2. char input[]; В С нельзя создавать динамические массивы таким образом. Размер этого массива будет неизвестен!


ты наверно не допонял. я обЪяснял зачем нужен этот массив.


Цитата
4. код не проверял Это код не откомпилируется никогда!

ессесно не скомпилится

Цитата
5. но думаю идея понятна. Если честно идея совершенно не понятна, а если я понял правильно, то ИМХО идея не верна!


Ладдно... счаз напишу работающий пример...

Автор: mr.DUDA 16.9.2004, 13:29
Цитата(LuckLess @ 16.9.2004, 12:00)
Бегать по текчту и сравнивать посимвольно , это слишком напряжно... проще:

гм... ничего не понял... LuckLess предлагает запихнуть строку в структуру, и "бегая по тексту" сравнивать кусок текста со структурой, где лежит образец строки ?

При сравнении двух структур - что происходит ? В примере - вообще ничего не произойдёт, т.к. не переопределён оператор "==" для класса (структуры). Но, допустим, напишем мы этот самый оператор "==". И как будем сравнивать поле "text" двух структур ? Функцией "strcmp" ? Тогда не понятно, почему не подходит "strstr", который сработает в 10-20 раз быстрей, чем беготня по строке с множественными вызовами "strcmp".

З.Ы. интересно, всё-таки, увидеть работающий пример от LuckLess...

Автор: LuckLess 16.9.2004, 14:13
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>


void main(void){
char input[50]={0};
typedef struct txt{
 char ftxt[4];
}zz;
int inpsize=0,rep;

zz ftext;
ftext.ftxt[0]='a';
ftext.ftxt[1]='a';
ftext.ftxt[2]='a';
ftext.ftxt[3]=0;
scanf("%49s",&input);

while(input[inpsize]!=0){
inpsize++;
}

rep=inpsize-sizeof(ftext.ftxt)+2;



for(;rep>0;rep--){
(*(zz*)((&input[0]+rep-1))).ftxt[3]=0;
if ( !strcmp( (*(zz*)((&input[0]+rep-1))).ftxt,ftext.ftxt )    ){printf("YUPPI");break;}
}



_getche();
}



Предлагаеться приводить кусок строки из input , к структуре (чтобы вырвать кусок строки нужной длинны)
а потом сравнивать текстовые поля структур(структуры приведенной из куска текста , и структуры где валяеться текст который ищеш).
Добавлено @ 14:18
mr.DUDA
Да , strstr будет быстрее , забыл про нее чтото.....
Но это удобнее чем алгоритм предложенный Coocky

Автор: Конструктор 16.9.2004, 16:42
Цитата

Затем Деннис и Брайан разработали по-настоящему извращенный диалект
Паскаля, назвав его "A". Когда мы обнаружили, что другие действительно
пытаются писать программы на A, мы быстро добавили еще парочку хитрых
примочек, создав B, BCPL, и, наконец, Си. Мы остановились, добившись
успешной компиляции следующего:

for(;P("\n"),R-;P("|"))for(e=C;e-;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);


Прошу пардона если кого расстроил smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)