strcpy() alternative ?
-
Tim schrieb:
strncpy() hat aber auch Macken.
#include <stdio.h> #include <string.h> int main (void) { char buf [10]; char *lit = "10 Zeichen"; strncpy ( buf, lit, sizeof buf ); puts ( buf ); return 0; }
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
-
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?
-
Also so wie ich das jetzt gelesen hab geht das so richtig :
char buf [10]; char *lit = "10 Zeichen"; strncpy ( buf, lit, sizeof buf ); buf[10] = '\0'; puts ( buf );
Und die Ausgabe ist richtig, allerdings bekomme ich nen Fehler vom Compiler :
Run-Time Check Failure #2 - Stack around the variable 'buf' was corrupted ...
-
Indizes beginnen bei 0. Index 10 würde demnach auf das 11. Element zugreifen, welches du ja offensichtlich nicht reserviert hast.
-
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