strncpy und Verwendung von sizeof kopieren maximale Anzahl von Zeichen
Bin ich mit dem nachstehenden code
char call[64] = {'\0'} /* clean buffer */
strncpy(call, info.called, sizeof(call));
Ich immer verwenden Sie den sizeof-für das Ziel der Schutz einer überfüllung, sofern die Quelle größer als das Ziel. Auf diese Weise kann ich verhindern, dass ein Puffer-überlauf, da es nur kopieren, soweit wie das Ziel verarbeiten kann.
Aber ich bin jetzt Fragen, ob es null beenden das Ziel.
Ein paar Fälle.
1) Wenn die Quelle größer ist.
Ich konnte dies tun:
call[strlen(call) - 1] = '\0'; /* insert a null at the last element.*/
2) Wenn die Quelle kleiner ist als das Ziel.
Anruf von 64 bytes, und ich kopiere die 50 bytes mit der Größe der Quelle. Wird es automatisch in die null in der 51 element?
Vielen vielen Dank für alle Informationen,
InformationsquelleAutor ant2009 | 2009-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn der source-Länge ist weniger als die max Zahl übergeben, die als Dritten parameter strncpy wird null-beenden Sie das Ziel, sonst nicht.
Wenn die Quelle gleich ist oder größer in der Länge als das Ziel - es ist Ihr problem mit ihm zu beschäftigen. Tun, wie Sie vorschlagen - der Aufruf von strlen() - wird nicht funktionieren, da der Puffer wird nicht mit null abgeschlossen und Sie laufen in ein Undefiniertes Verhalten.
Konnten Sie weisen einen größeren Puffer:
InformationsquelleAutor sharptooth
strncpy
wird nicht null-terminate das Ziel, wenn es schneidet die Zeichenfolge. Wenn Sie verwenden müssenstrncpy
, die Sie benötigen, um sicherzustellen, dass das Ergebnis ist beendet, so etwas wie:BSD -
strlcpy()
unter anderem, ist in der Regel als überlegen:http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy
Ich glaube nicht, strncpy wäre die Zeichenkette beenden. Nicht durch die Kündigung der Zeichenfolge. Könnte dies dazu führen, das ein echtes problem? Auch dadurch aufrufen[strlen(info.genannt - 1] = '\0'; Was ist der richtige Weg, um zu beenden, wenn die Quelle mehr oder weniger als das Ziel? Danke.
Ja, eine nicht beendete Zeichenkette verursachen
strlen()
,strcat()
usw., falsch, der Speicher beschädigt werden, und/oder Abstürzen. Einstellung das Letzte byte des Puffers null nicht Schaden nichts, wenn der string kürzer ist als das Ziel, also gibt es eigentlich keinen Grund, es zu machen, bedingt.Wenn du mit VC++ würd ich empfehlen strncpy_s, die dafür sorgt, dass die Saiten werden immer abgebrochen
Der andere trick von strncpy() ist, dass es immer voll null-pads der Ziel-string auf die angegebene Länge, wenn die Quelle ist kürzer als das Ziel. Das ist wichtig, wenn Sie kopieren Sie die 32 Byte von Daten in 4-KB-Puffer, sowie die 32 Byte von Daten, kopieren 4064 '\0' - Zeichen - was zum problem werden kann. Meiner Ansicht nach, strncpy() wurde entwickelt, um kopieren Sie die Datei name-Komponenten von bis zu 14 Zeichen in das Dateinamen-Teil eines alten Unix-directory-Eintrag. Der Datei-name Teil war bis zu 14 Zeichen, null gepolstert, aber nicht null-terminiert (und die letzten beiden Byte eines 2-byte inode-Nummer).
InformationsquelleAutor Tim Sylvester
Ihre Idee:
nicht funktionieren würde, so Sie anrufen würden
strlen()
auf einem nicht-terminierten stringInformationsquelleAutor
1) Aus cplusplus.com: "Keine null-Zeichen wird implizit an das Ende von destination, also Ziel wird nur null-terminiert sein, wenn die Länge der C-string in source weniger als num." So dass Sie, wenn Sie müssen Ihre Zeichenkette null-terminiert ist, müssen Sie dies tun:
Einem guten Weg, dies zu tun, wäre die Erstellung einer wrapper-Funktion für
strncpy
, die macht immer sicher, dass der string terminiert ist.2) Wenn die Quelle ist kürzer als das Ziel, das Ziel ist null-terminiert sein.
InformationsquelleAutor Martin B
Nein, strncpy nicht Versprechen, dass der Ziel-string wäre null beendet.
Es, um es zu korrigieren, die Sie verwenden sollten:
sizeof ist konstant, es gibt sizeof objet, wenn strlen tatsächlich berechnet die Laufzeit in der Länge der Zeichenfolge. Zum Beispiel für char tar[2]={0,0}; sizeof(tar)==2, aber, strlen(tar)==0;
InformationsquelleAutor Artyom
Verwenden Sie einfach strlcpy() statt strncpy().
Sie haben zu prüfen, ob es auf allen Plattformen verfügbar.
Frühe Versionen der linux wahrscheinlich nicht haben.
InformationsquelleAutor Thiagarajan Hariharan