C-Strings Nullzeichen (\0)
-
Da steht als include file "string.h" aber das ist doch auch in "cstring" enthalten des memcpy oder?
Weil "string.h" is doch veraltet, und die alten Funktionen gibts doch auch in den neueren Bibliotheken von C++ wieder.... so ähnlich is des doch?
Dankeschön schon mal im voraus.
-
rüdiger schrieb:
Das Problem ist das strncpy eine kaputte Funktion ist. Benutz sie einfach nicht. man: memcpy(3) ist dagegen wesentlich praktischer.
das hängt aber niemals selber eine 0 an.
-
rüdiger schrieb:
Das Problem ist das strncpy eine kaputte Funktion ist. Benutz sie einfach nicht. man: memcpy(3) ist dagegen wesentlich praktischer.
WTF? Das ist hier ein C++-Forum! Was spricht gegen 'std::copy'?
-
Stromberg schrieb:
Da steht als include file "string.h" aber das ist doch auch in "cstring" enthalten des memcpy oder?
Weil "string.h" is doch veraltet, und die alten Funktionen gibts doch auch in den neueren Bibliotheken von C++ wieder.... so ähnlich is des doch?
Dankeschön schon mal im voraus.Das ist die Doku der C Funktion. Aber std::memcpy in cstring gibt es natürlich auch.
pale dog schrieb:
rüdiger schrieb:
Das Problem ist das strncpy eine kaputte Funktion ist. Benutz sie einfach nicht. man: memcpy(3) ist dagegen wesentlich praktischer.
das hängt aber niemals selber eine 0 an.
Jup, aber hier ist man sich dessen bewusst und kopiert die 0 einfach gleich mit.
Konrad Rudolph schrieb:
rüdiger schrieb:
Das Problem ist das strncpy eine kaputte Funktion ist. Benutz sie einfach nicht. man: memcpy(3) ist dagegen wesentlich praktischer.
WTF? Das ist hier ein C++-Forum! Was spricht gegen 'std::copy'?
nichts. (wobei memcpy können viele Compiler inlinen bei richtigem alignment.)
-
Um nochmal kurz auf des Thema zu sprechen zu kommen. Also ich vwerwende jetzt immer "memcpy" aus <cstring>, da "strncpy" anscheinend "kaputt" ist. Doch was bedeutet den "kaputt" genau?
Und ich hab jetzt auch geblickt was ich falsch gemacht habe.
Mein Code:#include <iostream> #include <cstring> using namespace std; int main() { char n[]="King"; char d[6]; memcpy(d,n,5); cout << d << endl; return 0; }Ich hab sonst immer nur "memcpy(d,n,4) geschriebn, weil "King" ja 4 Buchstaben hat, aber anscheinend muss man auch noch eine Stelle dazu rechen (also 5), wegen des Nullzeichen..... ach kein plan, warum weiß ich eigentlich net, aber immer wenn ich noch eins dazu rechne dann gehts.
So würde es aber auch funktionieren (wies mir hier jemand gezeigt hat, kp wer jetzt nochmal war):
#include <iostream> #include <cstring> using namespace std; int main() { char n[]="King"; char d[5]; memcpy(d,n,4); d[4]=0; cout << d << endl; return 0; }Also auf welche Art soll ichs jetzt machen?

Dankeschön schon mal im Voraus.
-
Weiß den keiner was?
Dankeschön schon mal im Voraus.
-
strncpy() ist insofern "kaputt", daß es keinen \0 anhängt, wenn der Zielstring kürzer ist als der Quellstring. Und in dem Fall müsstest du auch bei memcpy() sleber für das Schlußzeichen sorgen
char str[5]; strncpy(str,"King",5);//klappt strncpy(str,"Hallo",5);//str wird NICHT nullterminiertPS: In C++ würde ich übrigens keine der C-Funktionen direkt verwenden, sondern lieber mit std::string arbeiten - die haben nicht die Speicherprobleme, an denen strcpy() und Co. zu knabbern haben.
-
Okay Dankeschön kapiert.
Dann hätt ich noch eine Frage zu "strchr". (Ich mach irgendwie gard die ganzen Funktionen für C-Strings durch, (also aus <cstring>) danach mach ich alle String Funktionen durch, aber man sollte ja alle mal kennen)
Strchr(s,c) sucht doch im C-String s nach dem Zeichen c, und gibt mir die erste Stelle aus an dem es c zum erstenmal gefunden hat, oder?
Aber bei mir funzt das nicht:#include <iostream> #include <cstring> using namespace std; int main() { char s1[]="K1ng"; char s2[]="Of"; char s3[]="Queens"; char MAIN[13]; strcpy(MAIN,s1); strcat(MAIN,s2); strcat(MAIN,s3); cout << MAIN << endl; cout << strchr(MAIN,"Q") << endl; //<-- HIER return 0; }FEHLERMELDUNG:
Compiling: C:\MinGW\Andi\strings.cpp
C:\MinGW\Andi\strings.cpp: In functionint main()': C:\\MinGW\\Andi\\strings.cpp:15: error: invalid conversion from \const char*' to `int'
C:\MinGW\Andi\strings.cpp:15: error: initializing argument 2 of `char* std::strchr(char*, int)'
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warningsIrgendwie kann man bei "c" nur ints angeben oder was? Aber ich will doch nach Buchstaben suchen? Hääää? Kann mir jemand helfen?
Dankeschön schon mal im Voraus.
-
"Q" entspricht { 'Q', '\0' }. Du kannst aber nur nach _einem_ Zeichen suchen, also 'Q' mit einfachen Anführungszeichen.
Das der Parameter den Typ int hat ist einfach historisch bedingt. In C hat das Literal 'Q' den Typ int.