C में स्ट्रिंग में मौजूद चेक सबस्ट्रिंग मौजूद है


169

मैं यह जाँचने की कोशिश कर रहा हूँ कि क्या स्ट्रिंग में C की तरह एक स्ट्रिंग है:

char *sent = "this is my sample example";
char *word = "sample";
if (/* sentence contains word */) {
    /* .. */
}

string::findC ++ में इसके बजाय क्या उपयोग करना है ?


7
आप चाहते हैं: char * strstr (const char * s1, const char * s2) - स्ट्रिंग s2 में स्ट्रिंग s2 की पहली घटना का पता लगाता है।
जॉन ओक्ट

@ जॉन मैंने सोचा था कि केवल चार्ट के लिए काम करता है। मैं नीचे दिए गए उत्तर में से एक को स्वीकार करूंगा, धन्यवाद ..
कोई भी '

आप के साथ मिश्रण कर रहे हैं strchr
जॉन

@ जोह आह, सही है, अब समझ में आता है। आप बहुत अच्छे हैं, फिर से धन्यवाद ..
कोई नहीं

जवाबों:


272
if(strstr(sent, word) != NULL) {
    /* ... */
}

ध्यान दें कि यदि शब्द पाया जाता है strstr, sentतो शब्द की शुरुआत में एक सूचक लौटाता wordहै।


1
आप "! = NULL" को भी हटा सकते हैं, मुझे लगता है कि स्ट्रॉन्ग रिटर्न 0 या 1
साइमन मिल्हौ

44
strstrएक सूचक लौटाता है; जब मैं संकेत के लिए परीक्षण करता हूं तो मुझे स्पष्ट होना पसंद है
nneonneo

3
... और falseहै0
जैक

8
मेरे भविष्य के संदर्भ के लिए टिप्पणी करें; strcasestrएक ही बात करता है लेकिन मामले की अनदेखी करता है।
आमोनेट

2
@NgoThanhNhan आप strstrयहाँ glibc के कार्यान्वयन को देख सकते हैं : github.com/lattera/glibc/blob/master/string/strstr.c । यह एक भोले कार्यान्वयन की तुलना में बहुत अधिक अनुकूलित है - और शायद एक सीधा स्व-परिभाषित फ़ंक्शन की तुलना में तेज़ है। फिर भी, जब संदेह, बेंचमार्क।
nnonneo


12

संकेत का उपयोग करने का प्रयास करें ...

#include <stdio.h>
#include <string.h>

int main()
{

  char str[] = "String1 subString1 Strinstrnd subStr ing1subString";
  char sub[] = "subString";

  char *p1, *p2, *p3;
  int i=0,j=0,flag=0;

  p1 = str;
  p2 = sub;

  for(i = 0; i<strlen(str); i++)
  {
    if(*p1 == *p2)
      {
          p3 = p1;
          for(j = 0;j<strlen(sub);j++)
          {
            if(*p3 == *p2)
            {
              p3++;p2++;
            } 
            else
              break;
          }
          p2 = sub;
          if(j == strlen(sub))
          {
             flag = 1;
            printf("\nSubstring found at index : %d\n",i);
          }
      }
    p1++; 
  }
  if(flag==0)
  {
       printf("Substring NOT found");
  }
return (0);
}

8

आप सबस्ट्रिंग की उपस्थिति का पता लगाने और इसे निकालने और प्रिंट करने के लिए दोनों के लिए यह एक कोशिश कर सकते हैं:

#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");
    return 0;
}

परीक्षण if(strcmp((ret=strstr(mainstring,substring)),substring))गलत है: यह केवल तभी मेल खाता है substringजब यह एक प्रत्यय है mainstring। बाकी फ़ंक्शन लिखने का एक जटिल तरीका है printf("and the sub string is:::%s\n", substring);
चकरली

5

यह कोड किसी भी तैयार किए गए फ़ंक्शन का उपयोग किए बिना खोज के कार्यों (तरीकों में से एक) के तर्क को लागू करता है:

public int findSubString(char[] original, char[] searchString)
{
    int returnCode = 0; //0-not found, -1 -error in imput, 1-found
    int counter = 0;
    int ctr = 0;
    if (original.Length < 1 || (original.Length)<searchString.Length || searchString.Length<1)
    {
        returnCode = -1;
    }

    while (ctr <= (original.Length - searchString.Length) && searchString.Length > 0)
    {
        if ((original[ctr]) == searchString[0])
        {
            counter = 0;
            for (int count = ctr; count < (ctr + searchString.Length); count++)
            {
                if (original[count] == searchString[counter])
                {
                    counter++;
                }
                else
                {
                    counter = 0;
                    break;
                }
            }
            if (counter == (searchString.Length))
            {
                returnCode = 1;
            }
        }
        ctr++;
    }
    return returnCode;
}

हालांकि यह कोड इस प्रश्न का उत्तर दे सकता है, कि यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
जाल

3

और यहां बताया गया है कि किस प्रकार पाया गया विकल्प से पहले वर्ण की स्थिति की रिपोर्ट करें:

इस कोड को उपरोक्त कोड में बदलें:

printf("%s",substring,"\n");

साथ में:

printf("substring %s was found at position %d \n", substring,((int) (substring - mainstring)));

3

मेरा अपना विनम्र (मामला संवेदनशील) समाधान:

uint8_t strContains(char* string, char* toFind)
{
    uint8_t slen = strlen(string);
    uint8_t tFlen = strlen(toFind);
    uint8_t found = 0;

    if( slen >= tFlen )
    {
        for(uint8_t s=0, t=0; s<slen; s++)
        {
            do{

                if( string[s] == toFind[t] )
                {
                    if( ++found == tFlen ) return 1;
                    s++;
                    t++;
                }
                else { s -= found; found=0; t=0; }

              }while(found);
        }
        return 0;
    }
    else return -1;
}

परिणाम

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) पर परीक्षण किया गया;)


1

इसे इस सरल कोड के साथ प्राप्त किया जाएगा: इनका उपयोग क्यों करें:

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");
   return 0;
}

लेकिन मुश्किल हिस्सा मूल स्ट्रिंग में किस स्थिति में रिपोर्ट करना होगा कि सबस्ट्रिंग शुरू होता है ...


1
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)
        {
            return 1;
        }
        else if(ans==1)
            return 0;
return 0;
}
int main(){
    char s[100001];
    char sub[100001];
    scanf("%s", &s);// Reading input from STDIN
    int 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");

    }
}

1

मुझे विश्वास है कि मेरे पास सबसे सरल उत्तर है। आपको इस प्रोग्राम में string.h लाइब्रेरी की जरूरत नहीं है, न ही stdbool.h लाइब्रेरी की। बस पॉइंटर्स और पॉइंटर अंकगणित का उपयोग करने से आपको एक बेहतर सी प्रोग्रामर बनने में मदद मिलेगी।

केवल गलत के लिए 0 लौटें (कोई विकल्प नहीं मिला), या 1 सच के लिए (हाँ, एक विकल्प "उप" समग्र स्ट्रिंग "स्ट्र" के भीतर पाया गया है):

#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) {
      return 1;
    }
    num_matches = 0;  // Reset counter to 0 whenever a difference is found. 
    str++;
  }
  return 0;
}

1
बफ़र ओवररन के बारे में क्या?
कैकाहेटे फ्रिटो

यहां बफर ओवरफ्लो कैसे होगा?
user9679882

शुरू करने के लिए, आप बफर के आकार को नहीं जानते हैं। इस 'सरल' कोड की कल्पना करें: char a[3] = "asd"; char b[2] = "as"; is_substr(a, b);इनपुट स्ट्रिंग्स एनयूएल-टर्मिनेटेड नहीं हैं, इसलिए आप ऐरे से आगे निकल जाते हैं।
काकाहुइते फ्रिटो

यदि बफ़र्स में से कोई भी आकार 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 () - इनपुट उपयोगकर्ता के आकार को पूर्वनिर्धारित किए बिना उपयोगकर्ता इनपुट को पढ़ने के लिए थोड़ा बोनस कोड प्रदान करना चाहिए।

#include <stdio.h>
#include <stdlib.h>

int string_len(char * string){
  int len = 0;
  while(*string!='\0'){
    len++;
    string++;
  }
  return len;
}

int string_contains(char *string, char *substring){
  int start_index = 0;
  int string_index=0, substring_index=0;
  int substring_len =string_len(substring);
  int s_len = string_len(string);
  while(substring_index<substring_len && string_index<s_len){
    if(*(string+string_index)==*(substring+substring_index)){
      substring_index++;
    }
    string_index++;
    if(substring_index==substring_len){
      return string_index-substring_len+1;
    }
  }

  return 0;

}

#define INPUT_BUFFER 64
char *read_line(){
  int buffer_len = INPUT_BUFFER;
  char *input = malloc(buffer_len*sizeof(char));
  int c, count=0;

  while(1){
    c = getchar();

    if(c==EOF||c=='\n'){
      input[count]='\0';
      return input;
    }else{
      input[count]=c;
      count++;
    }

    if(count==buffer_len){
      buffer_len+=INPUT_BUFFER;
      input = realloc(input, buffer_len*sizeof(char));
    }

  }
}

int main(void) {
  while(1){
    printf("\nEnter the string: ");
    char *string = read_line();
    printf("Enter the sub-string: ");
    char *substring = read_line(); 
    int position = string_contains(string,substring);
    if(position){ 
      printf("Found at position: %d\n", position);
    }else{
      printf("Not Found\n");
    }
  }
  return 0;
}

-1
#include <stdio.h>
#include <string.h>

int findSubstr(char *inpText, char *pattern);
int main()
{
    printf("Hello, World!\n");
    char *Text = "This is my sample program";
    char *pattern = "sample";
    int pos = findSubstr(Text, pattern);
    if (pos > -1) {
        printf("Found the substring at position %d \n", pos);
    }
    else
        printf("No match found \n");

    return 0;
}

int findSubstr(char *inpText, char *pattern) {
    int inplen = strlen(inpText);
    while (inpText != NULL) {

        char *remTxt = inpText;
        char *remPat = pattern;

        if (strlen(remTxt) < strlen(remPat)) {
            /* printf ("length issue remTxt %s \nremPath %s \n", remTxt, remPat); */
            return -1;
        }

        while (*remTxt++ == *remPat++) {
            printf("remTxt %s \nremPath %s \n", remTxt, remPat);
            if (*remPat == '\0') {
                printf ("match found \n");
                return inplen - strlen(inpText+1);
            }
            if (remTxt == NULL) {
                return -1;
            }
        }
        remPat = pattern;

        inpText++;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.