strstr
определяется в заголовке string.h.Если вы не включили string.h, strstr
необъявлено в вашем исходном файле, и оно неявно объявляется как возвращающее int и принимающее неуказанные аргументы (то есть, как если бы оно было объявлено int strstr()
).Это может быть проблематично, когда объектный файл для вашей программы связан со стандартной библиотекой C из-за возможных несоответствий сигнатур функций и, следовательно, предупреждения.
Решение простое: убедитесь, что вы включили string.h.
Что касается проблемы многократного появления строки поиска в строке, обратите внимание на первый абзац в разделе описания strstr
справочной страницы :
Функция strstr () находит первое вхождение подстроки needle в строке haystack .Завершающие нулевые байты ("\ 0") не сравниваются.
Хотя вы можете использовать strstr
для поиска нескольких подстрок, вам нужно будет перебрать строку, используя другое начальное расположениекаждый раз.В зависимости от того, с чего вы начнете, он может совпадать с ранее сопоставленными частями строки (например, «testest» будет считаться как 2 совпадения) или только с несопоставленными частями (например, «testest» будет считаться как 1).
Если выЖелая посчитать вхождения полного слова, а не только подстроки, strstr
не очень полезно.Одним из вариантов является использование strpbrk
или strcspn
для поиска слов (т.е. буквенных) символов и strspn
для поиска несловарных символов.С их помощью вы можете найти первый символ слова, сравнить со строкой поиска и, если она соответствует, проверить, что следующий символ не является алфавитным.Если это не так, увеличьте счетчик;если это так, перейдите к следующему слову.Кроме того, вы можете зацикливаться на каждом символе и использовать isalpha
, чтобы отличать буквы от не букв (следовательно, начала и конца слов).
Другой вариант - разделить ввод на список слов, затемотсканируйте список слов для поиска слова. Функция токенизации строк сделает это, хотя и изменит буфер, который вы передаете. Вы также можете использовать fscanf
, чтобы прочитать слово из файла за раз.Это дает дополнительное преимущество правильной обработки длинных строк.