C-Strings Nullzeichen (\0)
-
Und nächste Frage, bei folgendem Code ist es zwar wie ich vorhin gelernt habe nicht nötig ein Nullzeichen anzuhängen, aber anhängen kann man doch trotzdem eins wenn man lustig ist oder?
Aber irgendwie funktioniert das bei mir nicht.#include <iostream> using namespace std; int main() { char n[11]="Hallo Welt\0"; return 0; }In "n" ist Platz für 11 Zeichen, "Hallo Welt" sind 10 Zeichen + das Nullzeichen "\0" = 11 Zeichen. Aber trotzdem funktionierts nicht? Also ist das hier anscheinden nicht zulässig oder? Der Compiler erkennt mein Nullzeichen nicht, und hängt nochmal sein eigenes mit dran oder?
Dankeschön schon mal im Voraus.
-
Stromberg schrieb:
Der Compiler erkennt mein Nullzeichen nicht, und hängt nochmal sein eigenes mit dran oder?
richtig, du brauchst mindestens 12 zeichen...

-
Jap, woher soll der Kompiler oder Präprozessor denn wissen was du vorhast?
const char[] = "Hall\0o Wel\0t!\0";Woher soll er wissen welche Nullen das Ende markieren und welche einfach nur so da sind? Deshalb hängt er an String-Literale ("...") immer das Null-Zeichen an.
Gruß
Don06
-
Und noch n Problem, jetzt bin ich bei der Funktion "strncpy" angelangt, diese funktioniert ja so ähnlich wie strcpy, bloß das man ja bestimmen wie lang das rauszukopierende Wort sein soll.
Folgender Code:#include <iostream> #include <cstring> using namespace std; int main() { char n[11]; char l[]="Hallo Welt1234"; strncpy(n,l,10); cout << n << endl; return 0; }AUSGABE:
Hallo WeltùWas soll den bitte das "ù" da?
Versteh ich nicht
Dankeschön schon mal im Voraus.
-
http://www.cplusplus.com/reference/clibrary/cstring/strncpy.html
No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num.
-
Ja also so ganz verstanden hab ichs noch nciht warum des passiert. Könntest du mir das vll. bisschen genauer erklären.
Und anscheinend bin ich im Englischen auch nicht so gut, also ungefähr nach meinen Englischkentnissen hätte ich den Satz irgendwie so übersetzt.Kein Nullzeichen ist an das Ende vom Ziel angehängt worden, also wird das Ziel nur Null beendet sein wenn die Länge des C-Strings im Code kleiner als num ist.
Aber was mir das jetzt eigentlich genau sagen soll weiß ich beim besten Willen nicht.
Dankeschön schon mal im Voraus.
-
Es sagt nur, dass, wenn die Stringlänge kleiner als die Länge, die du bei num angegeben hast, ist, ein Terminierungszeichen angehängt wird. Ansonsten wird der String nicht nullterminiert!
=>#include <iostream> #include <cstring> int main() { char n[11]; char l[] = "Hallo Welt1234"; strncpy(n, l, 10); n[10] = 0; std::cout << n << std::endl; }
-
Äh also muss ich bei strncpy einfach immer das Nullzeichen selbst mit anhängen oder? Das es mir der Compiler nicht automatisch mit anhängt?
Dankeschön schon mal im Voraus.
-
Der Compiler soll da was machen? Hmm sollte normal die Funktion machen

Mach es einfach ...^^
-
Stromberg schrieb:
Äh also muss ich bei strncpy einfach immer das Nullzeichen selbst mit anhängen oder? Das es mir der Compiler nicht automatisch mit anhängt?
Dankeschön schon mal im Voraus.Das Problem ist das strncpy eine kaputte Funktion ist. Benutz sie einfach nicht. man: memcpy(3) ist dagegen wesentlich praktischer.
(Zur Frage wann du eine \0 anhängen musst. Immer wenn du etwas wo keine \0 dran hängt als C-String benutzen willst. Ohne \0 am Ende ist es kein C-String)
-
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.