Frage zur meiner String Funktion



  • Guten Tag, ich verstehe diese zwei Funktionen einfach überhaupt nicht. Ich bin Student und bin schon den ganzen morgen dran und komme einfach nicht drauf. Es sind zwei Funktionen. Kann mir da bitte wenn möglich jemand weiterhelfen? Sie funktioniert! Jedoch kann ich die Funktionen einfach nicht beschreiben.

    Header-Datei:

    #include <stdio.h>
    
    //Funktion zur Bestimmung der Länge des Strings:
    
    int lengthOfString(char word[])
    {
        int length = 0;
        while (word[length] != 0)
        {
            length++;
        }
        if (word[length-1] == '\n')
        {
            length--;
        }
        return length;
    }
    
    //Funktion zur Überprüfung ob Palindrom:
    
    int isPalindrom(char word[])
    {
        int i = 0;
        int length = lengthOfString(word);
        for (i = 0; i < length; i++)
        {
            if (word[i] != word[(length-i-1)])
            {
                return 0;
            }
        }
        return 1;
    }
    

    Main Datei:

    #include <stdio.h>
    #include "palindrommain.h"
    
    int main(void)
    {
        char word[63];
    
        //Eingabe:
        printf("Geben Sie das zu pruefende Wort ein: ");
        fgets (word, 63, stdin);
    
        //Überprüfung ob Palindrom und entsprechende Ausgabe
        if (isPalindrom(word))
        {
            printf ("Das Wort %sist ein Palindrom. ", word);
        }
        else
        {
            printf ("Das Wort %sist kein Palindrom. ", word);
        }
        return 0;
    }
    


  • Ups, jetzt sind die Einrückungen weg. Ich hoffe man erkennt es trotzdem.



  • Weißt Du was ein nullterminierter String ist?
    Weißt Du was ein Palindrom ist?

    Wenn zweimal "ja", dann muesstest Du die beiden Funktionen auch erklären können.

    Wenn nicht zweimal "ja", dann musst Du Dir das fehlende Wissen anlesen.



  • Okay, zur ersten Funktion. Solange das "word" an der Stelle von "length" nicht die binäre null hat soll er length++ machen. Ok, dann geht der eben alle Werte durch. Bei "Hallo" zb. hat er dann am ende 4, oder? 0 wird ja mitgezählt?!

    Aber was ich nicht verstehe ist das dann bei if. Da geht er ja dann wieder runter, also von 4 auf die 0?! Aber was soll das '\n' bedeuten?



  • ericgruen schrieb:

    Ups, jetzt sind die Einrückungen weg. Ich hoffe man erkennt es trotzdem.

    Schlecht.

    Du hast die Code-Tags vergessen:
    Curser auf den Anfang vom Code positionieren und auf den C-Button unter dem 😡 clicken (der Button bekommt einen 😉
    Dann den Cursor auf das Ende positionieren und nochmal auf den Button clicken. Das wars

    ODER

    Code mit der Maus markieren und einmal auf den Button clicken.

    Und das Beste: Du, als registriertes Mitglied, kannst deinen Beitrag noch nachtäglich editieren und das verbessern.



  • Danke



  • ericgruen schrieb:

    Okay, zur ersten Funktion. Solange das "word" an der Stelle von "length" nicht die binäre null hat soll er length++ machen. Ok, dann geht der eben alle Werte durch. Bei "Hallo" zb. hat er dann am ende 4, oder?

    Sollte eher 5 sein.

    ericgruen schrieb:

    Aber was ich nicht verstehe ist das dann bei if. Da geht er ja dann wieder runter, also von 4 auf die 0?! Aber was soll das '\n' bedeuten?

    Ist dir noch nie die Escapesequence \n begegnet?
    Auch nicht bei printf ?

    Oh, ich ssehe gerade, die benutzt du tatsächlich nicht.

    \n steht für NEWLINE (Zeilenvorschub) und kommt (bei dir) durch die Entertaste (die fgets mit abspeichert).



  • Und noch was:

    Funktionsdefinitionen (der Code der Funktion) haben in Headerdateien nichts, aber auch gar nichts zu suchen.

    In Headerdateien stehen (für Anfänger)
    - Deklarationen (von Variablen und Funktionen)
    - #define
    - typedef

    aber kein Code.

    Wenn du dein Programm in mehrere Teile aufsplitten willst, dann trage die *.c Dateien in dein Projekt ein.



  • Wenn das "word" an der Stelle "length-1" gleich neue Zeile ist, dann "length--"? Verstehe ist nicht, für was das gebraucht wird bzw was das nützt.



  • ericgruen schrieb:

    Solange das "word" an der Stelle von "length" nicht die binäre null hat soll er length++ machen. Ok, dann geht der eben alle Werte durch. Bei "Hallo" zb. hat er dann am ende 4, oder? 0 wird ja mitgezählt?!

    Aber was ich nicht verstehe ist das dann bei if. Da geht er ja dann wieder runter, also von 4 auf die 0?! Aber was soll das '\n' bedeuten?

    1. Bei word[0] findet er das 'H' von "Hallo". Deshalb wird der Schleifenkörper ausgeführt, und length wird von 0 auf 1 inkrementiert.
    Bei word[1] findet er das 'a' - es wird auf 2 inkrementiert.
    ... und so weiter ...
    Bei word[4] findet er das 'o' - es wird auf 5 inkrementiert.
    Bei word[5] findet er 0, der Schleifenkörper wird nicht mehr ausgeführt, length bleibt auf 5 stehen.

    So weit, so gut.
    2. Nun wird geprüft, ob das letzte Zeichen '\n' ist. Das ist das Zeichen für eine neue Zeile, soll in diesem Fall wohl nicht zum Wort zählen. Wenn das gefunden wird, wird von der Wortlänge eins abgezogen.
    Die Funktion liefert also sowohl für "Hallo", als auch für "Hallo\n" die Länge 5.



  • Wenn ich von der while Schleife bei "length" den Wert 5 habe und dann runter zur if Schleife komme, dann komme ich ja in die Schleife garnicht rein weil "length-1 =='\n'" nicht erfüllt ist. Sehe ich das richtig? 5-1=4 und das ist bei Hallo das "l". Und kein \n für neue Zeile.



  • Nicht ganz. Die Länge von "Hallo" ist 5.
    Bei word[length - 1] wird das 'o' gefunden, nicht das 'l', denn das 'H' steht auf word[0], das 'a' bei word[1] und so weiter ...
    Wäre die zu prüfende Zeichenkette aber
    "Hallo\n", so wäre die zunächst ermittelte Länge 6. Bei word[5] würde das '\n' gefunden, und deshalb die Länge um 1 vermindert, so dass als Ergebnis wieder die 5 geliefert werden würde.



  • Ja aber was macht das überhaupt für ein Sinn das mit \n gleich zu setzen?



  • Die Frage verstehe ich nicht ... Die Funktion prüft halt, ob der String mit einem Zeilenende aufhört, und falls ja, wird das (Zeilenende) bei der Stringlänge nicht mitgezählt, bzw. wieder abgezogen.



  • Der Hintergrund KÖNNTE folgender sein:
    Wenn Du auf der Konsole eine Eingabe machst, musst Du die mit einer Zeilenschaltung (Entertaste) abschließen.
    Manche Funktionen zum Einlesen von der Konsole lesen diese Zeilenschaltung mit ein, der eingelesene String endet also mit '\n'. Andere Funktionen zum Einlesen tun das aber nicht, sondern belassen das '\n' im Eingabestrom, bzw. im Tastaturpuffer.

    Deine Funktion ermittelt in jedem Fall die Stringlänge OHNE eine am Ende befindliche Zeilenschaltung.



  • Ach jetzt, wegen der Entertaste. Hat mich komplett raus gehauen. Ich bin einfach nicht darauf gekommen was es mit dem \n zu tun hatte. Aber jetzt weiß ich es ja zum glück, danke!



  • ericgruen schrieb:

    Ja aber was macht das überhaupt für ein Sinn das mit \n gleich zu setzen?

    Das ist eine besondere Anpassung an das Einlesen mit fgets und deiner Palindrom-Funktion.

    Ein Palindrom mit \n ist eher selten.



  • Noch ein kleiner Hinweis: Benutze deine Funktion "lengthOfString" nicht ohne geeignete Anpassung für Fälle, bei denen auch ein Leerstring auftreten könnte, denn dann passiert ein Zugriff mit Index = -1 und es kracht vermutlich. Ebenso darf natürlich als Parameter auch nicht NULL in deiner Funktion ankommen.


Anmelden zum Antworten