strncpy (Source > Dest) Verhalten
-
Guten morgen,
vorab: ich programmiere in C99 und habe keine "_s" version der strncpy:)
char* pSrc= "12345"; char dest[4]; strncpy(dest,pSrc, sizeof(dest)); /* to be sure string is terminated */ dest[sizeof(dest)-1] = '\0';
Liege ich richtig dass ich strncpy n (sizeof(dest)) Zeichen kopiert und ich keine undefined behavior bekomme?
-
Das ist, was der Code macht, ja.
-
@SoIntMan
Sogar die zusätzlliche Nullterminierung ist sinnvoll, daIf count is reached before the entire array src was copied, the resulting character array is not null-terminated.
-
@SoIntMan sagte in strncpy (Source > Dest) Verhalten:
char* pSrc= "12345";
char dest[4];strncpy(dest,pSrc, sizeof(dest));
/* to be sure string is terminated */
dest[sizeof(dest)-1] = '\0';Vielleicht eher:
#include <stdio.h> #include <string.h> int main() { char* pSrc = "12345"; char dest[4]; // Sicherstellen, dass dest immer nullterminiert ist strncpy(dest, pSrc, sizeof(dest) - 1); dest[sizeof(dest) - 1] = '\0'; printf("Copied string: %s\n", dest); // Ausgabe: "123" return 0; }
Interessant ist auch die Verwendung von strlcpy (nicht überall verfügbar, gehört nicht zum C99 Standard):
#include <stdio.h> #include <string.h> int main() { char* pSrc = "12345"; char dest[4]; strlcpy(dest, pSrc, sizeof(dest)); printf("Copied string: %s\n", dest); // Ausgabe: "123" return 0; }
strlcpy ist eine Alternative zu strncpy, da sicherstellt wird, dass die Zielzeichenkette nullterminiert ist, sofern der Puffer größer als 0 ist.
-
@Erhard-Henkes sagte in strncpy (Source > Dest) Verhalten:
@SoIntMan sagte in strncpy (Source > Dest) Verhalten:
char* pSrc= "12345";
char dest[4];strncpy(dest,pSrc, sizeof(dest));
/* to be sure string is terminated */
dest[sizeof(dest)-1] = '\0';Vielleicht eher:
#include <stdio.h> #include <string.h> int main() { char* pSrc = "12345"; char dest[4]; // Sicherstellen, dass dest immer nullterminiert ist strncpy(dest, pSrc, sizeof(dest) - 1); dest[sizeof(dest) - 1] = '\0'; printf("Copied string: %s\n", dest); // Ausgabe: "123" return 0; }
Aber warum? Das ist doch das gleiche, nur dass du weniger Zeichen kopierst als ginge.
-
@SeppJ sagte in strncpy (Source > Dest) Verhalten:
Aber warum? Das ist doch das gleiche, nur dass du weniger Zeichen kopierst als ginge.
So wird das letzte Byte nicht kopiert und anschließen mit NUL überschrieben.
-
@john-0 sagte in strncpy (Source > Dest) Verhalten:
So wird das letzte Byte nicht kopiert und anschließen mit NUL überschrieben.
Ne femto Sekunde schneller;)))
-
@SoIntMan sagte in strncpy (Source > Dest) Verhalten:
@john-0 sagte in strncpy (Source > Dest) Verhalten:
So wird das letzte Byte nicht kopiert und anschließen mit NUL überschrieben.
Ne femto Sekunde schneller;)))
Ich glaube auch, dass die beste Optimierungsmethode wohl ist, den String gar nicht erst kopieren zu müssen. Da sehe ich oft viel Potential bei String-Operationen. Es ist doch eher selten, dass man Strings tatsächlich "bearbeitet". Meistens werden sie einfach nur hin- und hergeschoben