Поиск слова в строке
Дана строка символов. Сколько раз в ней встречается слово введенное пользователем.
Знаю что есть ф-ция strstr(str1, str2), которая возвращает адрес первого вхождения строки str2 в строку str1. Но как заставить ее работать после найденной позиции еще раз до конца строки str1.
Помогите пожалуйста.
А в чем проблема? "Отрубай" начало строки, в котором уже найдено слово, и ищи в "отрубленной" строке дальше. И так далее, пока строка не закончится.
appearance = 0;// кол-во встреч str2
for(;(a = strstr(str1,str2)) > 0;)
{
str1 = a;
appearance++;
}
str1 = str_tmp;
То есть примерно так:
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);
За идею спасибо. Хотелось бы чтоб подсказали как объявлять и использовать указатели и адреса в этом случае.
Смысл понятен, вот только условие в цикле 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++;
прога правильная, только одна ошибка в синтаксисе в строчке 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";
А за идею большое спасибо!!
Знаю что есть ф-ция strstr(str1, str2), которая возвращает адрес первого вхождения строки str2 в строку str1. Но как заставить ее работать после найденной позиции еще раз до конца строки str1.
Помогите пожалуйста.
А почему бы не использовать std::string
там есть замечательный find
А почему бы не использовать std::string
там есть замечательный find
Я просто этого не знал. Спасибо, а пример использования можно?
Я просто этого не знал. Спасибо, а пример использования можно?
Да можно :)
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
Да можно :)
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
Спасибо!!!! Взял на заметку.