strncpy是比strcpy更安全的字符串拷貝函數,但在使用中須要注意一點:安全
No null-character is implicitly appended at the end of destination if source is longer than num. Thus, in this case, destination shall not be considered a null terminated C string (reading it as such would overflow).app
若是在strncpy後不顯式追加'\0',那麼你不可直接把它當作字符串使用處理,否則可能會出現亂碼,甚至程序奔潰。ide
追加下strncpy glibc的實現版本函數
char * STRNCPY (char *s1, const char *s2, size_t n) { char c; char *s = s1; --s1; if (n >= 4) { size_t n4 = n >> 2; for (;;) { c = *s2++; *++s1 = c; if (c == '\0') break; c = *s2++; *++s1 = c; if (c == '\0') break; c = *s2++; *++s1 = c; if (c == '\0') break; c = *s2++; *++s1 = c; if (c == '\0') break; if (--n4 == 0) goto last_chars; } n = n - (s1 - s) - 1; if (n == 0) return s; goto zero_fill; } last_chars: n &= 3; if (n == 0) return s; do { c = *s2++; *++s1 = c; if (--n == 0) return s; } while (c != '\0'); zero_fill: do *++s1 = '\0'; while (--n > 0); return s; }