strcpy() alternative ?



  • Tim schrieb:

    killerkipferl schrieb:

    das problem tritt aber nur dann auf wenn man den string *lit nicht mit \0 abschließt...

    steht sogar extra was in den manpages drin dazu

    Ein Stringliteral ist immer nullterminiert. Ich weiss ehrlich gesagt nicht genau was du mir da erzählen willst?

    bin heute wohl nimma ganz munter 🙂

    gut wenn ich nun deine zeichen zähle die char *lit hat komm ich auf 10. du hast für buf 10 elemente reserviert... wenns nun ein \0 auch noch hat dann hat *lit 11 elemente oder lieg ich da schon wieder falsch?

    somit kommt es zu einem overflow



  • killerkipferl schrieb:

    Tim schrieb:

    killerkipferl schrieb:

    das problem tritt aber nur dann auf wenn man den string *lit nicht mit \0 abschließt...

    steht sogar extra was in den manpages drin dazu

    Ein Stringliteral ist immer nullterminiert. Ich weiss ehrlich gesagt nicht genau was du mir da erzählen willst?

    bin heute wohl nimma ganz munter 🙂

    gut wenn ich nun deine zeichen zähle die char *lit hat komm ich auf 10. du hast für buf 10 elemente reserviert... wenns nun ein \0 auch noch hat dann hat *lit 11 elemente oder lieg ich da schon wieder falsch?

    Nein, das ist schon richtig. 10 "normale" Zeichen und dann noch die terminierende '\0'.

    killerkipferl schrieb:

    somit kommt es zu einem overflow

    Nein, es kommt nicht zum Overflow, zumindest noch nicht beim strncpy(). Es hat aber den Effekt, dass der String dann nicht mehr nullteminiert ist. Die Folgen daraus kannst du dir ja denken...



  • Also ich hab hier eben ein Beispiel gefunden : http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_013_014.htm#Xxx999412 aber auch da bekomme ich genau den selben Fehler...

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 20
    
    int main(void) {
       char str1[MAX];
       char str2[] = "Ein Teststring welcher laenger"
                     " als 20 Zeichen ist";
       /* MAX-Zeichen in str1 kopieren */
       strncpy(str1, str2, MAX);
       /* Wichtig, String am Ende terminieren !! */
       str1[MAX] = '\0';
       printf("%s\n",str1);
       return EXIT_SUCCESS;
    }
    

    Quellcode stammt aus dem Galileo-Buch



  • und weiterer Beweis, dass dieses Buch für gar nichts taugt... schon das zweite Mal heute 😮 galileocomputing.de sollte das Buch vom Netz nehmen, so wie der Autor es bereits bei seinem Mirror getan hat.



  • Das Buch macht also auch Anfängerfehler 😉



  • toxor schrieb:

    ...
       char str1[MAX];
    ...
       str1[MAX] = '\0';
    

    die elemente von 'str' haben den index 0 bis MAX-1. somit haust du die 0 irgendwo ausserhalb des arrays in den speicher.
    🙂



  • Hmmm jo klingt einleuchtend :p

    also einfach :

    str1[MAX-1] = '\0';
    

    schreiben ?



  • toxor schrieb:

    also einfach :

    str1[MAX-1] = '\0';
    

    schreiben ?

    richtig. und beim 'strncpy' könntest du auch 'MAX-1' angeben, weil das letzte zeichen ja sowieso die 0 sein muss.
    🙂



  • Ok super , vielen Dank für die Hilfe, ihr habt es einfach drauf 😃



  • toxor schrieb:

    ihr habt es einfach drauf

    jedenfalls sind wir besser als dieser jürgen wolf.
    🙂



  • Tim schrieb:

    Das Buch macht also auch Anfängerfehler 😉

    traurig aber wahr... diese angeblich gute einsteigerlektüre ist ein einziger anfängerfehler

    darum ists ja gratis 😛


Anmelden zum Antworten