String nach Zeichen aus char-Array durchsuchen



  • 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