সি-তে একটি স্ট্রিংয়ে চেক সাবস্ট্রিং বিদ্যমান


169

আমি স্ট্রিংয়ের সি এর মতো একটি স্ট্রিং রয়েছে কিনা তা খতিয়ে দেখার চেষ্টা করছি:

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

string::findসি ++ এর পরিবর্তে ব্যবহার করার জন্য কী কী ?


7
আপনি চান: চর * স্টারস্টার (কনস্ট চর * এস 1, কনস্ট চর * এস 2) - স্ট্রিং এস 2 এর স্ট্রিং এস 2 এর প্রথম উপস্থিতির সন্ধান করে।
জোনএইচ

@ জন এইচ আমি ভেবেছিলাম যে কেবল চরগুলির জন্য কাজ করে। আমি নীচের উত্তরগুলির মধ্যে একটি গ্রহণ করব, ধন্যবাদ ..
নেই

আপনি এটি মিশ্রিত করা হয় strchr
জোনএইচ

@ জন এইহ্ ঠিক আছে, এখনই তা বোধ হয়। তুমি মহান, আবার ধন্যবাদ ..
কেউ

উত্তর:


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

নোট করুন যে শব্দটি পাওয়া গেলে strstrশব্দটির শুরুতে একটি পয়েন্টার দেয় ।sentword


1
আপনি "! = নুল" কেও মুছে ফেলতে পারেন, আমার মনে হয় স্ট্রাস্টার 0 বা 1 প্রদান করে
সাইমন মিলহউ

44
strstrএকটি পয়েন্টার দেয়; আমি যখন পয়েন্টারগুলির জন্য পরীক্ষা করি তখন আমি স্পষ্ট হওয়া পছন্দ করি।
nneonneo

3
... এবং falseহয়0
জ্যাক

8
আমার ভবিষ্যতের রেফারেন্সের জন্য মন্তব্য; strcasestrএকই জিনিস কিন্তু মামলা উপেক্ষা।
অ্যামনেট

2
@ এনজিও থানহানহান আপনি strstrএখানে গ্লিবিসি বাস্তবায়ন দেখতে পাবেন : github.com/lattera/glibc/blob/master/string/strstr.c । এটি একটি নির্দোষ বাস্তবায়নের চেয়ে অনেক বেশি অনুকূলিত - এবং সম্ভবত একটি সরল স্ব-সংজ্ঞায়িত ফাংশনের চেয়ে দ্রুত। তবুও, সন্দেহ হলে, বেঞ্চমার্ক।
nneonneo


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);
chqrlie

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

এটিমেগা 328 পি তে পরীক্ষা করা হয়েছে (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

আমি বিশ্বাস করি যে আমার কাছে সহজ উত্তর রয়েছে। এই প্রোগ্রামে আপনার স্ট্রিংহ লাইব্রেরি বা স্টাডবুল। কেবল পয়েন্টার এবং পয়েন্টার গাণিতিক ব্যবহার আপনাকে আরও ভাল সি প্রোগ্রামার হতে সাহায্য করবে।

কেবল মিথ্যা (কোন স্ট্রিং খুঁজে পাওয়া যায় নি) এর জন্য 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
বাফারকে ছাড়িয়ে যাওয়ার কী হবে?
ক্যাকাহুয়েত ফ্রিটো

এখানে বাফার ওভারফ্লো কীভাবে ঘটবে?
ব্যবহারকারী 9679882

শুরু করার জন্য, আপনি বাফারের আকারটি জানেন না। এই 'সাধারণ' কোডটি কল্পনা করুন: 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);
ক্যাকাহুয়েট ফ্রিটো

এবং এ কারণেই strnstr()উপস্থিত রয়েছে (কমপক্ষে libbsd এ)
ক্যাকাহুয়েত ফ্রিটো 20'19

1

সি ব্যবহার করে - কোন ফাংশনে অন্তর্নির্মিত

স্ট্রিং_কন্টেনগুলি () সমস্ত ভারী উত্তোলন করে এবং 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++;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.