Você também pode remover o "! = NULL", acho que o strstr retorna 0 ou 1
Simon MILHAU
44
strstrretorna um ponteiro; Eu gosto de ser explícito ao testar ponteiros.
N12
3
... e falseé0
Jack
8
Comente para minha referência futura; strcasestrfaz a mesma coisa, mas ignora maiúsculas e minúsculas.
amonett
2
@NgoThanhNhan Você pode ver a implementação da strstrin glibc aqui: github.com/lattera/glibc/blob/master/string/strstr.c . É muito mais otimizado que uma implementação ingênua - e provavelmente mais rápido que uma função autodefinida direta. No entanto, em caso de dúvida, benchmark.
Você pode tentar este para encontrar a presença da substring e para extraí-la e imprimi-la:
#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;}
O teste if(strcmp((ret=strstr(mainstring,substring)),substring))está incorreto: ele corresponde apenas substringse for um sufixo mainstring. O restante da função é uma maneira complicada de escrever printf("and the sub string is:::%s\n", substring);.
precisa
5
Este código implementa a lógica de como a pesquisa funciona (uma das maneiras) sem usar nenhuma função pronta:
Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
JAL
3
E aqui está como relatar a posição do primeiro caractere da substring encontrada:
Substitua esta linha no código acima:
printf("%s",substring,"\n");
com:
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
Testado no ATmega328P (avr8-gnu-toolchain-3.5.4.1709);)
O mesmo será obtido com este código mais simples: Por que usar estes:
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;}
Mas a parte mais complicada seria relatar em qual posição na string original a substring inicia ...
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");}}
Eu acredito que tenho a resposta mais simples. Você não precisa da biblioteca string.h neste programa, nem da biblioteca stdbool.h. O simples uso de ponteiros e aritmética de ponteiros o ajudará a se tornar um programador C melhor.
Basta retornar 0 para False (nenhuma substring encontrada) ou 1 para True (sim, uma substring "sub" é encontrada na cadeia geral "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;}
Para começar, você não sabe o tamanho do buffer. Imagine este código 'simples': as char a[3] = "asd"; char b[2] = "as"; is_substr(a, b);seqüências de entrada não são terminadas em NUL; portanto, você excede a matriz.
Cacahuete Frito
Se algum dos buffers for do tamanho 0 (matrizes do tamanho 0 não existem, mas isso é possível e também legal do ponto de vista do usuário da função):char a[4] = "asd"; char b[3]= "as"; is_substr(a+4, b);
Cacahuete Frito 20/03/19
E essa é a razão strnstr()existe (pelo menos no libbsd)
Cacahuete Frito
1
Usando C - Nenhuma função incorporada
string_contains () faz todo o trabalho pesado e retorna 1 índice baseado. Resto são códigos de driver e auxiliar.
Atribua um ponteiro à string principal e à substring, aumente o ponteiro de substring ao fazer a correspondência, pare de fazer um loop quando o ponteiro de substring for igual ao comprimento da substring.
read_line () - Um pequeno código de bônus para ler a entrada do usuário sem predefinir o tamanho da entrada que o usuário deve fornecer.
strchr
.Respostas:
Observe que
strstr
retorna um ponteiro para o início da palavrasent
se a palavraword
for encontrada.fonte
strstr
retorna um ponteiro; Eu gosto de ser explícito ao testar ponteiros.false
é0
strcasestr
faz a mesma coisa, mas ignora maiúsculas e minúsculas.strstr
in glibc aqui: github.com/lattera/glibc/blob/master/string/strstr.c . É muito mais otimizado que uma implementação ingênua - e provavelmente mais rápido que uma função autodefinida direta. No entanto, em caso de dúvida, benchmark.Use
strstr
para isso.http://www.cplusplus.com/reference/clibrary/cstring/strstr/
Então, você escreveria como ..
fonte
Tente usar ponteiros ...
fonte
Você pode tentar este para encontrar a presença da substring e para extraí-la e imprimi-la:
fonte
if(strcmp((ret=strstr(mainstring,substring)),substring))
está incorreto: ele corresponde apenassubstring
se for um sufixomainstring
. O restante da função é uma maneira complicada de escreverprintf("and the sub string is:::%s\n", substring);
.Este código implementa a lógica de como a pesquisa funciona (uma das maneiras) sem usar nenhuma função pronta:
fonte
E aqui está como relatar a posição do primeiro caractere da substring encontrada:
Substitua esta linha no código acima:
com:
fonte
Minha própria solução humilde (diferencia maiúsculas de minúsculas):
Resultados
Testado no ATmega328P (avr8-gnu-toolchain-3.5.4.1709);)
fonte
O mesmo será obtido com este código mais simples: Por que usar estes:
Mas a parte mais complicada seria relatar em qual posição na string original a substring inicia ...
fonte
fonte
Eu acredito que tenho a resposta mais simples. Você não precisa da biblioteca string.h neste programa, nem da biblioteca stdbool.h. O simples uso de ponteiros e aritmética de ponteiros o ajudará a se tornar um programador C melhor.
Basta retornar 0 para False (nenhuma substring encontrada) ou 1 para True (sim, uma substring "sub" é encontrada na cadeia geral "str"):
fonte
char a[3] = "asd"; char b[2] = "as"; is_substr(a, b);
seqüências de entrada não são terminadas em NUL; portanto, você excede a matriz.char a[4] = "asd"; char b[3]= "as"; is_substr(a+4, b);
strnstr()
existe (pelo menos no libbsd)Usando C - Nenhuma função incorporada
string_contains () faz todo o trabalho pesado e retorna 1 índice baseado. Resto são códigos de driver e auxiliar.
Atribua um ponteiro à string principal e à substring, aumente o ponteiro de substring ao fazer a correspondência, pare de fazer um loop quando o ponteiro de substring for igual ao comprimento da substring.
read_line () - Um pequeno código de bônus para ler a entrada do usuário sem predefinir o tamanho da entrada que o usuário deve fornecer.
fonte
fonte