Alternative zu "strcpy" in c++
In C, die ich verwendet strcpy
zu machen Tiefe Kopie einer Schnur, aber es ist immer noch "fine" Verwendung strcpy
in C++ oder gibt es bessere alternativen, welche sollte ich stattdessen verwenden ?
- Ist dein string null-terminiert oder nicht? stackoverflow.com/q/4691608/176769
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C++ am einfachsten ist meist die Verwendung der Klasse std::string statt char*.
Die Zeile "b = a;" tut die gleiche Sache, die Sie würde normalerweise mit strcpy.
std::string
'soperator=
eigentlich nicht tun, eine Tiefe Kopie. Es macht einen Verweis gezählt kopieren (und damit nicht genau das tun, wasstrcpy
tut). Wenn Sie möchten, um eine Tiefe Kopie einesstd::string
, müssen Sie rufen Sie es so auf:std::string a = "Hello."; std::string b; b = a.c_str();
zu erzwingen, dass es eigentlich eine Kopie machen, statt nur zu kopieren, die Zeiger und das Inkrementieren der Referenz-count.std::string
zu verwenden. Mit derc_str()
version funktioniert in jedem Fall, obwohl.Lege ich diese in den Kommentar oben, aber nur damit der code lesbar:
Also, wenn Sie wirklich wollen, zu imitieren das Verhalten von
strcpy
Sie müssen kopieren Sie Sie mitc_str()
;UPDATE
Es sollte angemerkt werden, dass die C++11-standard verbietet ausdrücklich die gemeinsame copy-on-write-Muster, die verwendet wurde, in vielen Implementierungen von
std::string
zuvor. So, reference counting-strings ist nicht mehr zulässig, und im folgenden wird das erstellen einer Kopie:c_str()
macht eine Kopie": es gibt nur die raw -char*
Daten. Diese Daten werden dann an das std::string Konstruktor, führt die eigentliche Kopie. Wenn es nicht kopiert ist, wird b würde für ungültig erklärt werden, sobald eine ging von Geltungsbereich oder zerstört wurde.c_str()
macht eine Kopie. Ich sagteb = a.c_str()
macht eine Kopie des Strings.c_str()
ist nicht der Schwerpunkt des Betriebes; der copy-Zuweisungsoperator ist.Wenn Sie c++ - strings, verwenden Sie einfach den copy-Konstruktor:
Des zuweisungsoperators
Wenn Sie müssen, verwenden Sie c-style-strings (d.h. null-terminierte char arrays), dann, ja, nur mit strcpy, oder als eine sicherere alternative, strncpy.
Werden Sie vorgeschlagen, um zu verwenden strcpy_s, weil zusätzlich zu den Ziel-und Quell-Argumente, es ist ein zusätzliches argument für die Größe der Ziel-buffer-overflow, der zu vermeiden. Aber das ist wahrscheinlich immer noch die Schnellste Möglichkeit zum kopieren von auf einer saite, wenn Sie mit char-arrays/Zeigern.
Beispiel: