Вы также можете удалить «! = NULL», я думаю, что strstr возвращает 0 или 1
Симон МИЛЬЯУ
44
strstrвозвращает указатель; Мне нравится быть явным, когда я проверяю указатели.
nneonneo
3
... и falseэто0
Джек
8
Комментарий для моей будущей ссылки; strcasestrделает то же самое, но игнорирует регистр
amonett
2
@NgoThanhNhan Вы можете увидеть реализацию strstrв glibc здесь: github.com/lattera/glibc/blob/master/string/strstr.c . Он гораздо более оптимизирован, чем наивная реализация, и, вероятно, быстрее, чем простая самоопределяемая функция. Тем не менее, когда сомневаешься, эталон.
Вы можете попробовать это как для обнаружения наличия подстроки, так и для извлечения и печати:
#include<stdio.h>#include<string.h>int main(void){char mainstring[]="The quick brown fox jumps over the lazy dog";char substring[20],*ret;int i=0;
puts("enter the sub string to find");
fgets(substring,sizeof(substring), stdin);
substring[strlen(substring)-1]='\0';
ret=strstr(mainstring,substring);if(strcmp((ret=strstr(mainstring,substring)),substring)){
printf("substring is present\t");}
printf("and the sub string is:::");for(i=0;i<strlen(substring);i++){
printf("%c",*(ret+i));}
puts("\n");return0;}
Тест if(strcmp((ret=strstr(mainstring,substring)),substring))неверен: он соответствует, только substringесли он является суффиксом mainstring. Остальная часть функции - запутанный способ записи printf("and the sub string is:::%s\n", substring);.
Chqrlie
5
Этот код реализует логику работы поиска (одним из способов) без использования какой-либо готовой функции:
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
JAL
3
А вот как сообщить о позиции первого символа из найденной подстроки:
Замените эту строку в приведенном выше коде:
printf("%s",substring,"\n");
с участием:
printf("substring %s was found at position %d \n", substring,((int)(substring - mainstring)));
strContains("this is my sample example","th")// 1
strContains("this is my sample example","sample")// 1
strContains("this is my sample example","xam")// 1
strContains("this is my sample example","ple")// 1
strContains("this is my sample example","ssample")// 0
strContains("this is my sample example","samplee")// 0
strContains("this is my sample example","")// 0
strContains("str","longer sentence")// -1
strContains("ssssssample","sample")// 1
strContains("sample","sample")// 1
Протестировано на ATmega328P (avr8-gnu-toolchain-3.5.4.1709);)
То же самое будет достигнуто с помощью этого более простого кода: зачем использовать эти:
int main(void){char mainstring[]="The quick brown fox jumps over the lazy dog";char substring[20];int i=0;
puts("enter the sub stirng to find");
fgets(substring,sizeof(substring), stdin);
substring[strlen(substring)-1]='\0';if(strstr(mainstring,substring)){
printf("substring is present\t");}
printf("and the sub string is:::");
printf("%s",substring,"\n");return0;}
Но сложнее было бы сообщить, с какой позиции в исходной строке начинается подстрока ...
My code to find out if substring is exist in string or not
// input ( first line -->> string , 2nd lin ->>> no. of queries for substring
following n lines -->> string to check if substring or not..#include<stdio.h>int len,len1;int isSubstring(char*s,char*sub,int i,int j){int ans =0;for(;i<len,j<len1;i++,j++){if(s[i]!= sub[j]){
ans =1;break;}}if(j == len1 && ans ==0){return1;}elseif(ans==1)return0;return0;}int main(){char s[100001];char sub[100001];
scanf("%s",&s);// Reading input from STDINint no;
scanf("%d",&no);int i ,j;
i=0;
j=0;int ans =0;
len = strlen(s);while(no--){
i=0;
j=0;
ans=0;
scanf("%s",&sub);
len1=strlen(sub);int value;for(i=0;i<len;i++){if(s[i]==sub[j]){
value = isSubstring(s,sub,i,j);if(value){
printf("Yes\n");
ans =1;break;}}}if(ans==0)
printf("No\n");}}
Я считаю, что у меня есть самый простой ответ. Вам не нужна ни библиотека string.h в этой программе, ни библиотека stdbool.h. Простое использование указателей и арифметики указателей поможет вам стать лучшим программистом Си.
Просто верните 0 для False (подстрока не найдена) или 1 для True (да, подстрока "sub" найдена в общей строке "str"):
#include<stdlib.h>int is_substr(char*str,char*sub){int num_matches =0;int sub_size =0;// If there are as many matches as there are characters in sub, then a substring exists.while(*sub !='\0'){
sub_size++;
sub++;}
sub = sub - sub_size;// Reset pointer to original place.while(*str !='\0'){while(*sub ==*str &&*sub !='\0'){
num_matches++;
sub++;
str++;}if(num_matches == sub_size){return1;}
num_matches =0;// Reset counter to 0 whenever a difference is found.
str++;}return0;}
Для начала, вы не знаете размер буфера. Представьте себе этот «простой» код: char a[3] = "asd"; char b[2] = "as"; is_substr(a, b);входные строки не заканчиваются NUL, поэтому вы заполняете массив.
Какауэте Фрито
Если какой-либо из буферов имеет размер 0 (массивы размера 0 не существуют, но это возможно, а также допустимо с точки зрения пользователя функции):char a[4] = "asd"; char b[3]= "as"; is_substr(a+4, b);
Cacahuete Frito
И это причина strnstr()существует (по крайней мере, на libbsd)
Cacahuete Frito
1
Использование C - нет встроенных функций
string_contains () выполняет всю тяжелую работу и возвращает 1 основанный индекс. Остальные коды водителя и помощника.
Назначьте указатель на основную строку и подстроку, увеличьте указатель подстроки при сопоставлении, прекратите зацикливание, если указатель подстроки равен длине подстроки.
read_line () - Небольшой бонусный код для чтения пользовательского ввода без указания размера ввода, который должен предоставить пользователь.
strchr
.Ответы:
Обратите внимание, что
strstr
возвращает указатель на начало слова,sent
если словоword
найдено.источник
strstr
возвращает указатель; Мне нравится быть явным, когда я проверяю указатели.false
это0
strcasestr
делает то же самое, но игнорирует регистрstrstr
в glibc здесь: github.com/lattera/glibc/blob/master/string/strstr.c . Он гораздо более оптимизирован, чем наивная реализация, и, вероятно, быстрее, чем простая самоопределяемая функция. Тем не менее, когда сомневаешься, эталон.Используйте
strstr
для этого.http://www.cplusplus.com/reference/clibrary/cstring/strstr/
Итак, вы бы написали это как ...
источник
Попробуйте использовать указатели ...
источник
Вы можете попробовать это как для обнаружения наличия подстроки, так и для извлечения и печати:
источник
if(strcmp((ret=strstr(mainstring,substring)),substring))
неверен: он соответствует, толькоsubstring
если он является суффиксомmainstring
. Остальная часть функции - запутанный способ записиprintf("and the sub string is:::%s\n", substring);
.Этот код реализует логику работы поиска (одним из способов) без использования какой-либо готовой функции:
источник
А вот как сообщить о позиции первого символа из найденной подстроки:
Замените эту строку в приведенном выше коде:
с участием:
источник
Мое собственное скромное (чувствительное к регистру) решение:
Полученные результаты
Протестировано на ATmega328P (avr8-gnu-toolchain-3.5.4.1709);)
источник
То же самое будет достигнуто с помощью этого более простого кода: зачем использовать эти:
Но сложнее было бы сообщить, с какой позиции в исходной строке начинается подстрока ...
источник
источник
Я считаю, что у меня есть самый простой ответ. Вам не нужна ни библиотека string.h в этой программе, ни библиотека stdbool.h. Простое использование указателей и арифметики указателей поможет вам стать лучшим программистом Си.
Просто верните 0 для False (подстрока не найдена) или 1 для True (да, подстрока "sub" найдена в общей строке "str"):
источник
char a[3] = "asd"; char b[2] = "as"; is_substr(a, b);
входные строки не заканчиваются NUL, поэтому вы заполняете массив.char a[4] = "asd"; char b[3]= "as"; is_substr(a+4, b);
strnstr()
существует (по крайней мере, на libbsd)Использование C - нет встроенных функций
string_contains () выполняет всю тяжелую работу и возвращает 1 основанный индекс. Остальные коды водителя и помощника.
Назначьте указатель на основную строку и подстроку, увеличьте указатель подстроки при сопоставлении, прекратите зацикливание, если указатель подстроки равен длине подстроки.
read_line () - Небольшой бонусный код для чтения пользовательского ввода без указания размера ввода, который должен предоставить пользователь.
источник
источник