當(dāng)strncpy遇上指針

隨著對(duì)代碼安全性的要求越來(lái)越高,strncpy正式登上了歷史舞臺(tái)。

strncpy在項(xiàng)目中使用較多,一不注意可能會(huì)出錯(cuò),因此記錄一下,方便后續(xù)翻閱查看。

strncpy函數(shù)原型

    char * strncpy(char * str2, char * str1, int size);

基本用法

    char src[20] = {0};
    strncpy(src, "This is test string", sizeof(src)-1);
    printf("src[%s]\n", src);

打印結(jié)果為:

    src[This is test ]

遇到指針之后

    char src[20] = {0};
    strncpy(src, "This is test string", sizeof(src)-1);

    char* dst = (char*)malloc(20);
    strncpy(dst, src, sizeof(dst)-1);
    printf("src[%s],len[%d]\ndst[%s],len[%d]\n", src, strlen(src), dst, strlen(dst));

運(yùn)行結(jié)果如下:

    src[This is test ],len[19]
    dst[Thi],len[3]

我們發(fā)現(xiàn)運(yùn)行結(jié)果出現(xiàn)了異常。原因的sizeof計(jì)算指針變量的大小時(shí),并不是返回指針?biāo)赶虻目臻g的大小,而是指針變量本身的大小,在32位系統(tǒng)中為4字節(jié),因此,目標(biāo)字符串長(zhǎng)度為3,被無(wú)意間截?cái)嗔恕?/p>

為了避免這種情況,我們常使用如下方式調(diào)用strncpy:

    char src[20] = {0};
    strncpy(src, "This is test string", sizeof(src)-1);

    char* dst = (char*)malloc(20);
    strncpy(dst, src, strlen(src)+1);
    printf("src[%s],len[%d]\ndst[%s],len[%d]\n", src, strlen(src), dst, strlen(dst));

此時(shí),結(jié)果就正常了。

注意,此時(shí)使用的是strlen(src)+1,而不是strlen(dst)-1。

總結(jié)

  • 安全拷貝字符串,使用strncpy函數(shù)
  • 注意拷貝字符串的長(zhǎng)度計(jì)算,字符數(shù)組可使用sizeof計(jì)算,字符指針需要使用原字符串長(zhǎng)度(strlen(src)+1),+1是因?yàn)楫?dāng)拷貝的長(zhǎng)度size大于待拷貝字符串長(zhǎng)度時(shí),strncpy函數(shù)會(huì)在后面自動(dòng)補(bǔ)上'\0'。我們多拷貝一個(gè)字符,相當(dāng)于讓strncpy函數(shù)幫忙在目標(biāo)字符串結(jié)尾加上'\0'結(jié)束符。
  • sizeof計(jì)算指針變量長(zhǎng)度,是int類型在該系統(tǒng)所占內(nèi)存的大小
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、(一共三十題) 1.main() { int a[5]={1,2,3,4,5}; int *ptr=(int ...
    iOS_Alex閱讀 825評(píng)論 0 2
  • 一、(一共三十題) 1.main() { int a[5]={1,2,3,4,5}; int *ptr=(int ...
    iOS_Alex閱讀 1,134評(píng)論 0 0
  • 1.在C++ 程序中調(diào)用被C 編譯器編譯后的函數(shù),為什么要加extern “C”? 答:首先,extern是C/C...
    曾令偉閱讀 957評(píng)論 0 4
  • 2016年5月20日 中證500: 滬深300: 中證500:PB分位點(diǎn)=40.39% PE分位點(diǎn)...
    我是廖強(qiáng)閱讀 287評(píng)論 0 2
  • 在我從未投稿之前,曾一度以我寫(xiě)東西全憑心緒的起承轉(zhuǎn)合為榮,試著投了兩篇之后,拒稿的理由大都是故事性不強(qiáng)、太私人化無(wú)...
    落沙舞閱讀 219評(píng)論 0 0

友情鏈接更多精彩內(nèi)容