Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск слова в строке

435
24 сентября 2003 года
avatara
188 / / 07.07.2003
Проблема такая:
Дана строка символов. Сколько раз в ней встречается слово введенное пользователем.

Знаю что есть ф-ция strstr(str1, str2), которая возвращает адрес первого вхождения строки str2 в строку str1. Но как заставить ее работать после найденной позиции еще раз до конца строки str1.
Помогите пожалуйста.
463
24 сентября 2003 года
waterman
178 / / 17.01.2003
А в чем проблема? "Отрубай" начало строки, в котором уже найдено слово, и ищи в "отрубленной" строке дальше. И так далее, пока строка не закончится.
463
24 сентября 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by waterman
А в чем проблема? "Отрубай" начало строки, в котором уже найдено слово, и ищи в "отрубленной" строке дальше. И так далее, пока строка не закончится.

463
24 сентября 2003 года
waterman
178 / / 17.01.2003
То есть примерно так:

 
Код:
str_tmp = str1;
appearance = 0;// кол-во встреч str2
for(;(a = strstr(str1,str2)) > 0;)
{
  str1 = a;
  appearance++;
}
str1 = str_tmp;
435
25 сентября 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by waterman
То есть примерно так:

 
Код:
str_tmp = str1;
appearance = 0;// кол-во встреч str2
for(;(a = strstr(str1,str2)) > 0;)
{
  str1 = a;
  appearance++;
}
str1 = str_tmp;


Смысл понятен, вот только условие в цикле FOR какое-то интересное. По-моему цикл работать не будет. Дело в том что, ф-ция strstr(s1,s2) возвращает адрес!! поэтому str1=a недопустимо. Вот именно и уменя такая проблема. Немогу разобраться с указателями и адресами и их правильным объявлением. Да и вместо str_tmp = str1; и str1 = str_tmp; лучше использовать
strcpy(str_tmp, str1); и strcpy(str1, str_tmp);
За идею спасибо. Хотелось бы чтоб подсказали как объявлять и использовать указатели и адреса в этом случае.

401
25 сентября 2003 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by avatara

Смысл понятен, вот только условие в цикле FOR какое-то интересное. По-моему цикл работать не будет. Дело в том что, ф-ция strstr(s1,s2) возвращает адрес!! поэтому str1=a недопустимо. Вот именно и уменя такая проблема. Немогу разобраться с указателями и адресами и их правильным объявлением. Да и вместо str_tmp = str1; и str1 = str_tmp; лучше использовать
strcpy(str_tmp, str1); и strcpy(str1, str_tmp);
За идею спасибо. Хотелось бы чтоб подсказали как объявлять и использовать указатели и адреса в этом случае.



прога правильная, только одна ошибка в синтаксисе в строчке for - не хватает в конце ";)", и str1 должно быть указателем, а не строчкой. вот мой вариант:

char *pstr = str1;
int appearence = 0;
while((pstr = strstr(pstr,str2))!=NULL)appearence++;

435
25 сентября 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by Br@in RIPper


прога правильная, только одна ошибка в синтаксисе в строчке for - не хватает в конце ";)", и str1 должно быть указателем, а не строчкой. вот мой вариант:

char *pstr = str1;
int appearence = 0;
while((pstr = strstr(pstr,str2))!=NULL)appearence++;




Ваши способа оба не рабочие потому что программа входит в вечный цикл!!! Ведь возвращается все время тот же адрес на первое вхождение!!!

Правильней сделать наверное так:
(кстати этот вариант рабочий - проверял)
char str1[101];

int i=0;
cout<<"\nPlease input string (max 100 symbols) - \n";
cin>>str1;
char str2[24];
cout<<"\nPlease input word - \n";
cin>>str2;
char *pstr = str1;
int appearence = 0;
while((pstr = strstr(pstr,str2))!=NULL)
{
appearence++;
pstr=pstr+strlen(str2);
//все вы забыли сделать вот это!!!
//ведь не только надо находить вхождение,
//но и стартовать после этого слова!!
}
cout<<"\nFind "<<appearence<<" times\n";

А за идею большое спасибо!!

509
30 сентября 2003 года
Moroz
52 / / 20.12.1999
Цитата:
Originally posted by avatara
Знаю что есть ф-ция strstr(str1, str2), которая возвращает адрес первого вхождения строки str2 в строку str1. Но как заставить ее работать после найденной позиции еще раз до конца строки str1.
Помогите пожалуйста.



А почему бы не использовать std::string
там есть замечательный find

435
01 октября 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by Moroz


А почему бы не использовать std::string
там есть замечательный find


Я просто этого не знал. Спасибо, а пример использования можно?

509
01 октября 2003 года
Moroz
52 / / 20.12.1999
Цитата:
Originally posted by avatara

Я просто этого не знал. Спасибо, а пример использования можно?



Да можно :)
std::string strSource = "Template String Source", strFind = "lat";

std::string::type_size pos=0;

pos=strSource.find(strFind,pos)
if (pos!=std::string::npos)
{
// pos - индекс начала включения искомого слова
}
//поиск далее после найденной подстроки
pos=strSource.find(strFind,pos+strFind.size())

конкретно посмотри в MSDN на
ms-help://MS.MSDNQTR.2003JAN.1033/vcstdlib/html/vclrf_string_basicstringfind.htm

435
02 октября 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by Moroz


Да можно :)
std::string strSource = "Template String Source", strFind = "lat";

std::string::type_size pos=0;

pos=strSource.find(strFind,pos)
if (pos!=std::string::npos)
{
// pos - индекс начала включения искомого слова
}
//поиск далее после найденной подстроки
pos=strSource.find(strFind,pos+strFind.size())

конкретно посмотри в MSDN на
ms-help://MS.MSDNQTR.2003JAN.1033/vcstdlib/html/vclrf_string_basicstringfind.htm



Спасибо!!!! Взял на заметку.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог