So vermeiden Sie strcpy_s Puffer zu klein
Muss ich kopieren std::string data
in ein char-array. Die Länge meiner Strings ist variabel, aber die Länge von meinem char-array ist fest.
const int SIZE = 5;
char name[SIZE];
std::string data = "1234567890";
strcpy_s(name, 5, data.c_str()); //causes a buffer is too small assertion
strcpy_s(name, 11, data.c_str());//copies fine (length of data plus null)
strcpy_s(name, sizeof(data), data.c_str()); //copies fine
Wie kann ich kopieren, nur die Länge des Arrays sicher jedes mal? Ohne die Geltendmachung und ohne Puffer laufen über.
Sollte ich es tun wie diese jedes mal, die?
std::string toCopy = data.substr(0,SIZE-1);
strcpy_s(name, toCopy.c_str());
- Wenn dieser auf C++11, können Sie einfach die string-Puffer.
- ja der C++ll. Können Sie mir ein Beispiel was du meinst??
- wenn du meinst "mstrcpy_s(name, Daten.c_str());" dies gibt mir die assert-Fehler, die ich vermeiden will.
- Nur tun
s2 = s1;
(oder einen substring, nach Bedarf) statt mit C-strings. Wenn Sie brauchen, das Zeichen, Zeiger, verwenden Sie&s2[0]
für eine, die ist änderbar bis kurz vor den abschließenden null-terminator oderc_str()
für eine nicht-modifizierbar eine.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden strncpy_s mit
_TRUNCATE
Zum Beispiel:
kopieren so viel, wie es zum füllen der
name
Puffer, während weiterhin die null-Terminierung zu berücksichtigen (im Gegensatz zu den traditionellen strncpy).Folgende gibt ein ERANGE Ergebnis, denn Sie müssen Platz für das abschließende NULL-Zeichen. Variable 'data' enthält 10 Elemente. Wenn strcpy_s erreicht die Einschränkung '5' es nicht gelingt, einen abschließenden NULL und gibt ERANGE.
strcpy_s(name, 5, Daten.c_str());
In Der Microsoft-Dokumentation
Alternativer Ansatz
nullchar
. Wirklich seltsam Verhalten, und auf jeden Fall eine seltsame Fehlermeldung.