wer findet den fehler



  • bambi schrieb:

    http://mirror.fsf.org/pmon2000/3.x/src/lib/libc/strnchr.c 🙄

    Bitte die Frage im Text haben, damit man sie rezitieren kann oder auch nicht.

    bambi schrieb:

    wer findet den fehler
    http://mirror.fsf.org/pmon2000/3.x/src/lib/libc/strnchr.c 🙄

    Außerdem keine Links auf Quellcode nehmen, die man klicken muss.

    bambi schrieb:

    wer findet den fehler
    http://mirror.fsf.org/pmon2000/3.x/src/lib/libc/strnchr.c 🙄

    include <string.h>
    
    char *
    strnchr(const char *p, char c, size_t n)
    {
    	if (!p)
    		return (0);
    
    	while (n-- > 0) {
    		if (*p == c)
    			return ((char *)p);
    		p++;
    	}
    	return (0);
    }
    

    Ab dann kriegste vielleicht Antworten.

    Im vorliegenden Fall muss ich zu lange lachen, um zu antworten.
    Und gerade Dir nicht.

    (In Wirklichkeit lag ich 45min auf dem Boden vor Lachen und werde noch 6 Wochen lang wie ein Freak aussehen wegen bambi. Da hat er mich echt erwischt. Ich dachte, ich sterbe.)



  • Andromeda schrieb:

    Nach dem Erhöhen des Pointers wird auf Stringende geprüft und abgebrochen, wenn dieser Fall eingetreten ist. Warum funzt das nicht?

    a) du bekommst Probleme mit dem Leerstring ""
    b) du kannst nicht nach '\0' suchen.



  • Aber wo ist denn nun der Fehler?
    Ich seh keinen.

    Außer, das mit const wegcasten, das soll man ja nicht machen.



  • DirkB schrieb:

    b) du kannst nicht nach '\0' suchen.

    Glaube ich nicht. Denn das "if (*p == c) return p;" kommt doch davor.



  • Andromeda schrieb:

    DirkB schrieb:

    b) du kannst nicht nach '\0' suchen.

    Glaube ich nicht. Denn das "if (*p == c) return p;" kommt doch davor.

    Da findest du das aber nur bei einem Leerstring.



  • hmhmhm schrieb:

    Aber wo ist denn nun der Fehler?
    Ich seh keinen.

    Es wird nicht auf das Stringende geprüft.



  • DirkB schrieb:

    Andromeda schrieb:

    DirkB schrieb:

    b) du kannst nicht nach '\0' suchen.

    Glaube ich nicht. Denn das "if (*p == c) return p;" kommt doch davor.

    Da findest du das aber nur bei einem Leerstring.

    Stimmt, sonst müsste ich p returnen.
    Ach, die ganze Funktion ist einfach doof. 😞



  • Warum hast du dich für das Preinkrement entschieden?



  • DirkB schrieb:

    Warum hast du dich für das Preinkrement entschieden?

    Es soll direkt nach dem Hochzählen auf 0 geprüft werden. Ansonsten wird noch ein Schleifendurchlauf gemacht.



  • Mit einem Postinkrement wären beide Probleme weg.



  • DirkB schrieb:

    Mit einem Postinkrement wären beide Probleme weg.

    Naja, eigentlich sucht man nicht nach 0 im String, weil eine 0 bedeutet, dass der String zuende ist. Jedenfalls in C.



  • Andromeda schrieb:

    DirkB schrieb:

    Mit einem Postinkrement wären beide Probleme weg.

    Naja, eigentlich sucht man nicht nach 0 im String, weil eine 0 bedeutet, dass der String zuende ist. Jedenfalls in C.

    Komisch, strcat macht erstmal genau das.
    Und ich bekomme gleich den Pointer darauf und muss nicht mehr rechnen.

    Mit dem Postinkrement behebst du auch das Problem, wenn du ein Zeichen in einem Leerstring suchst.
    (Das du mit dem Preinkrement hast)



  • DirkB schrieb:

    hmhmhm schrieb:

    Aber wo ist denn nun der Fehler?
    Ich seh keinen.

    Es wird nicht auf das Stringende geprüft.

    Oh mann...
    Da könnt ich mir doch glatt Vorwürfe machen.



  • DirkB schrieb:

    Andromeda schrieb:

    DirkB schrieb:

    Mit einem Postinkrement wären beide Probleme weg.

    Naja, eigentlich sucht man nicht nach 0 im String, weil eine 0 bedeutet, dass der String zuende ist. Jedenfalls in C.

    Komisch, strcat macht erstmal genau das.

    Es muss ja auch wissen wo der string aufhört.
    Die vorliegende Funktion kann dann z.B. 0 zurückgeben, was soviel heisst wie "nicht gefunden"



  • Andromeda schrieb:

    Die vorliegende Funktion kann dann z.B. 0 zurückgeben, was soviel heisst wie "nicht gefunden"

    👍



  • Naja, das ist Ansichtssache. Eine '\0' gehört zu jedem String.
    Man kann zwar memchr nehmen, aber warum nicht mit einer kleinen Änderung richtig machen?



  • DirkB schrieb:

    warum nicht mit einer kleinen Änderung richtig machen?

    Da hat er kein Interesse dran, siehst Du doch in anderen Threads ...



  • DirkB schrieb:

    Naja, das ist Ansichtssache. Eine '\0' gehört zu jedem String.
    Man kann zwar memchr nehmen, aber warum nicht mit einer kleinen Änderung richtig machen?

    Das "richtig machen" liegt im Auge des Betrachters. Der OP gab uns leider keine exakte Spezifikation, wie sich die Funktion verhalten soll. Das erklärt auch das Rumgeeiere hier.



  • Belli schrieb:

    DirkB schrieb:

    warum nicht mit einer kleinen Änderung richtig machen?

    Da hat er kein Interesse dran, siehst Du doch in anderen Threads ...

    Welche anderen Threads?



  • Andromeda schrieb:

    DirkB schrieb:

    Naja, das ist Ansichtssache. Eine '\0' gehört zu jedem String.
    Man kann zwar memchr nehmen, aber warum nicht mit einer kleinen Änderung richtig machen?

    Das "richtig machen" liegt im Auge des Betrachters. Der OP gab uns leider keine exakte Spezifikation, wie sich die Funktion verhalten soll. Das erklärt auch das Rumgeeiere hier.

    Spezifikation? Dachte, wenn es strchr und memchr gibt, sollte strnchr ein strchr sein, welches nach spätestens n abbricht. War aber nur mein Gedankengang. Die null hab ich jetzt nicht extra gesucht, aber meinen code angepasst, auch wenn er dadurch etwas langsamer wird. Vllt. braucht das ja mal jemand...


Anmelden zum Antworten