首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 標準庫 strncpy 兩種實作版本差異與標準行為解析

     編輯:關於C語言

版本一:簡易版(非標準)

char *strncpy(char *dst, const char *src, size_t count) {
    char *tmp = dst;
    while (count-- && (*dst++ = *src++) != '\0') ;
    return tmp;
}

特性:複製至 \0 或達 count 即停止,不補齊 \0。若 src 長度 ≥ count,dst 不以 \0 結尾,極易造成後續字串操作越界。

版本二:標準版(ANSI C / ISO C99)

char *strncpy(char *dst, const char *src, size_t count) {
    char *tmp = dst;
    while (count && (*dst++ = *src++) != '\0') count--;
    while (count--) *dst++ = '\0';
    return tmp;
}

特性:複製 src 至 \0 或達 count;若提前遇 \0,剩餘位元組全部填 \0。保證 dst 前 count 位元組皆被寫入,且若 src 較短則以 \0 尾端填充。

關鍵差異比較

情境版本一版本二(標準)
strlen(src) >= count複製 count 字元,無 \0 結尾複製 count 字元,無 \0 結尾
strlen(src) < count複製至 \0 停止,剩餘未寫入複製至 \0,剩餘填 \0

使用陷阱與最佳實踐

  1. 永不假設 strncpy 產生以 \0 結尾的字串,呼叫後請手動執行 dst[count-1] = '\0'。
  2. 偏好使用 snprintf(dst, count, "%s", src) 或 strlcpy(BSD)等安全替代品。
  3. 教學/面試常考:strncpy 不保證字串結尾,strncat 保證。

補充:指標參數傳遞本質

void test(char *p) { p++; } // 只改變區域副本
int main() {
    char *a = "123456";
    test(a);
    puts(a); // 仍輸出 "123456"
    a++; puts(a); // 輸出 "23456"
}

指標按值傳遞,函數內修改指標變數本身不影響呼叫端;若需修改呼叫端指標,需傳 char **。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved