Überprüfen Sie, ob die Teilzeichenfolge in einer Zeichenfolge in C vorhanden ist

Lesezeit: 4 Minuten

Benutzer-Avatar von none
keiner

Ich versuche zu überprüfen, ob eine Zeichenfolge eine Teilzeichenfolge in C enthält, wie:

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

Was ist etwas zu verwenden statt string::find in C++?

  • Sie wollen: char *strstr(const char *s1, const char *s2) – lokalisiert das erste Vorkommen der Zeichenfolge s2 in Zeichenfolge s1.

    – JonH

    8. Oktober 2012 um 15:29 Uhr

  • @JonH Ich dachte, das funktioniert nur für Zeichen. Ich werde eine der folgenden Antworten akzeptieren, danke.

    – keiner

    8. Oktober 2012 um 15:37 Uhr

  • du verwechselst das damit strchr.

    – JonH

    8. Oktober 2012 um 15:48 Uhr

  • @ JonH ahh richtig, es macht jetzt Sinn. du bist toll, danke nochmal..

    – keiner

    8. Oktober 2012 um 15:59 Uhr

Benutzeravatar von nneonneo
nneonneo

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

Beachten Sie, dass strstr gibt einen Zeiger auf den Anfang des Wortes in zurück sent wenn das Wort word gefunden.

  • Sie können auch das “! = NULL” entfernen, ich denke, strstr gibt 0 oder 1 zurück

    – Simon MILHAU

    8. Oktober 2012 um 15:31 Uhr

  • strstr gibt einen Zeiger zurück; Ich mag es, explizit zu sein, wenn ich nach Hinweisen suche.

    – nneonneo

    8. Oktober 2012 um 15:31 Uhr

  • … und false ist 0

    – Jack

    13. Februar 2015 um 2:58 Uhr

  • Kommentar für meine zukünftige Referenz; strcasestr macht dasselbe, ignoriert aber Groß- und Kleinschreibung.

    – Amonett

    5. Juni 2015 um 5:58 Uhr

  • @NgoThanhNhan Sie können die Implementierung von sehen strstr in glibc hier: github.com/lattera/glibc/blob/master/string/strstr.c. Es ist viel optimierter als eine naive Implementierung – und wahrscheinlich schneller als eine einfache selbstdefinierte Funktion. Trotzdem im Zweifel Benchmark.

    – nneonneo

    13. November 2017 um 3:16 Uhr

Verwenden strstr dafür.

http://www.cplusplus.com/reference/clibrary/cstring/strstr/

Also würdest du es schreiben wie..

char *sent = "this is my sample example";
char *word = "sample";

char *pch = strstr(sent, word);

if(pch)
{
    ...
}

Benutzeravatar von JustVirtually
Einfach virtuell

Versuchen Sie, Zeiger zu verwenden …

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

jeevans Benutzeravatar
Jeewan

Sie können dies versuchen, um sowohl das Vorhandensein der Teilzeichenfolge zu finden als auch zu extrahieren und zu drucken:

#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;
}

Benutzeravatar von derlo
derlo

Und so melden Sie die Position des ersten Zeichens der gefundenen Teilzeichenfolge:

Ersetzen Sie diese Zeile im obigen Code:

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

mit:

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

Benutzeravatar von Peter Mortensen
Peter Mortensen

Dieser Code implementiert die Logik, wie die Suche funktioniert (eine der Möglichkeiten), ohne eine vorgefertigte Funktion zu verwenden:

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;
}

Meine eigene bescheidene (Groß-/Kleinschreibung beachtende) Lösung:

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
                {
                    if( ++found == tFlen ) return 1;
                    s++;
                    t++;
                }
                else { s -= found; found=0; t=0; }

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

Ergebnisse

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

Getestet auf ATmega328P (avr8-gnu-toolchain-3.5.4.1709) 😉

1425970cookie-checkÜberprüfen Sie, ob die Teilzeichenfolge in einer Zeichenfolge in C vorhanden ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy