String nach Zeichen aus char-Array durchsuchen



  • Hallo liebes Forum,

    folgender, von mir geschriebener Code, durchsucht ein Array nach EINEM Zeichen und sagt mir dann, ob dieses in dem String vor kommt oder nicht.

    ------------------------------------------------------------

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

    int suche(char string[], char zeichen)
    {
    for(int i = 0; i < strlen(string); i++)
    {
    if(string[i] == zeichen)
    return 1;
    else
    ++i;
    }
    return 0;

    }

    int main(int argc, const char * argv[])
    {

    char string[] = "Hello World!";
    char zeichen = 'a';
    if(suche(string, zeichen))
    {
    printf("Der String enhält das gesuchte Zeichen %c!",zeichen);
    }
    else
    printf("Der String enthält das gesuchte Zeichen %c nicht!",zeichen);

    }

    ------------------------------------------------------------

    Ausgehen von diesem Code wäre es jetzt toll, wenn ich einen String nach mehreren Zeichen durchsuchen könnte, welche in einem Array gespeichert sind. Toll wäre eine Lösung bei der das Programm mir mitteilt, ob überhaupt ein Zeichen aus dem Array im String enthalten ist und eine, die mir sagt, welche Zeichen wie oft im String enthalten sind.

    Das Array sollte z.B. so aussehen char suchen[] = {'a','A','c','C',5,6,7};

    Wäre wirklich toll, wenn mir jemand helfen würde 🙂

    beste Grüße
    Fabian


  • Mod

    Teste und verbessere erst einmal die Originalfunktion. Die ist
    1. falsch
    2. ineffizient, da sie quadratisch in der Laufzeit quadratisch mit der Länge der Zeichenkette geht

    Allgemein: Gibt es einen Grund, nicht strchr, bzw. strpbrk zu benutzen?

    Zur Frage: Wo ist das Problem? Geh zeichenweise vor und vergleiche jeweils mit allen Zeichen des Suchstrings. Du musst schon eine Frage stellen, wenn man dir antworten soll.

    Benutze von nun an auch die Formatierungstags für Code, zu finden unter dem Editorfenster, bei den Smileys.



  • F4b14n schrieb:

    Ausgehen von diesem Code wäre es jetzt toll, wenn ich einen String nach mehreren Zeichen durchsuchen könnte, welche in einem Array gespeichert sind. Toll wäre eine Lösung bei der das Programm mir mitteilt, ob überhaupt ein Zeichen aus dem Array im String enthalten ist und eine, die mir sagt, welche Zeichen wie oft im String enthalten sind.

    Ja, das wäre toll. Hausaufgabe?

    Ich vermisse eine Frage. Wie sieht dein bisheriger Versuch aus? Wo hast du konkret Schwierigkeiten?



  • Als Parameter sollte die Funktion neben dem String und den Suchzeichen auch noch das Array für das Ergebnis mitbekommen.

    Und auch das Array suchen sollte Nullterminiert sein:

    char suchen[] = {"aAcC\x5\x6\x7"};
    

    Sollen das wirklich die Zeichen mit dem Code 5, 6 und 7 sein oder meinst du die Zeichen, die die Ziffern darstellen ( '5', '6' und '7' )?

    size_t suchehist(const char *string, const char *zeichen, size_t *histogramm);
    


  • Einfach nur Übung, keine Hausaufgabe.

    Danke aber für die bisherigen Antworten.
    Den String Stück für Stück nach den Elementen von "Array" zu durchsuchen habe ich bereits versucht, hat aber leider nicht geklappt. Werde später - bin gerade mit etwas anderem beschäftigt - den Versuch hier mal posten.

    Also danke bis dahin! 🙂



  • was seppj mit ineffizient meint ist, dass die stringlänge bei jedem schleifendurchlauf immer wieder neu berechnet wird.
    ruf also besser strlen einmal auf und speicher den wert in einer variable. diese variable benutzt du dann im bedingungsteil der for-schleife.

    F4b14n schrieb:

    Toll wäre eine Lösung bei der das Programm mir mitteilt, ob überhaupt ein Zeichen aus dem Array im String enthalten ist und eine, die mir sagt, welche Zeichen wie oft im String enthalten sind.

    Das Array sollte z.B. so aussehen char suchen[] = {'a','A','c','C',5,6,7};

    Wäre wirklich toll, wenn mir jemand helfen würde 🙂

    beste Grüße
    Fabian

    nimm ein integer-array, das mindestens genau so viele elemente hat wie dein array suchen.
    das integer-array und das array suchen übergibst du an deine suchfunktion.
    position 0 im integer-array speichert wie oft das zeichen suchen[0] im string vorkommt, usw.



  • Die "richtige" Abbruchbedingung ist nicht i < strlen(string) sondern

    for(int i = 0; string[i] != '\0'; i++)
    


  • Vielen Dank []_ für deinen Tipp, speziell auch mit der strlen und DirkB für die Abbruchbediengung! 🙂

    Werde es gleich später so versuchen!



  • Wenn du die Idee von []_ umsetzt, dann wirst du feststellen, dass die Paramterliste meinem Vorschlag sehr ähnlich ist.

    Ich habe size_t genommen, da es der vorgesehene Typ dafür ist.
    Allerdings sollte das i dann auch vom Typ size_t sein.

    Ich gehe jetzt nicht davon aus, das du so große Strings hast, das int an seine Grenzen stößt, aber man kann es ja gleich richtig machen. 😉


  • Mod

    SeppJ schrieb:

    Teste und verbessere erst einmal die Originalfunktion. Die ist
    1. falsch

    Dies ist viel wichtiger! Kümmer dich erst einmal darum ,den einfachen Fall richtig hinzubekommen:

    http://ideone.com/nrzTVm



  • Tipp: welchen Wert hat i im ersten und im zweiten Durchlauf deiner Schleife?



  • Ich check es einfach nicht, sorry 😞

    Mein Code sieht jetzt erstmal wie folgt aus.

    #include <stdio.h>
    #include <string.h>
    
    int suche(char string[], char zeichen[])
    {
        for(int i = 0; string[i] != '\0'; i++)
        {
            for(int a = 0; zeichen[a] != '\0'; a++)
            {
                if(string[i] == zeichen[a])
                    return 1;
                else
                    ++a;
            }
        }
        return 0;
    
    }
    
    int main(int argc, const char * argv[])
    {
    
        char string[] = "Hello World!";
        char zeichen[] = {'a','A','x','X','5','6','8'};
        if(suche(string, zeichen))
        {
            printf("Der String enhält eines der gesuchten Zeichen!");
        }
        else
            printf("Der String enthält keines der gesuchten Zeichen!");
    
    }
    


  • zeichen enthält kein Stringende-Kennzeichen, deshalb undefiniertes Verhalten.



  • Danke Wutz,

    trotzdem funktioniert das Programm nicht so, wie es soll.



  • Du inkrementierst a doppelt und überspringst damit Zeichen.



  • Hab den else-Block rausgenommen und siehe da, es funktioniert.
    Warum war ich nur so doof 😞

    Vielen Dank!


Anmelden zum Antworten