• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            liyuxia713

            蹣跚前行者

            常用鏈接

            統(tǒng)計(jì)

            Algorithms

            C++

            最新評論

            深入理解strcpy,strncpy

            ~對初學(xué)者屬于深入理解吧,高手請勿在此浪費(fèi)寶貴時間~

            看到這樣一個改錯題:
            char p[5]; 
            char* s="12345"
            strcpy(p,s);
               cout << p << endl;
            錯誤之處是很顯然的,作為字符串字面值的"12345"會在結(jié)尾處自動加上空字符null,從而長度是6,上面的strcpy是會越界的,從而是個越界錯誤。
            問題是我以為這樣的程序編譯的時候會出錯呢!但是我在vc上運(yùn)行時是可以輸出正確結(jié)果的,這讓我很是納悶!后來找到了strcpy的源代碼才知原因,strcpy函數(shù)是不進(jìn)行越界處理的. 又因?yàn)閟trcpy連null一起復(fù)制,從而p能輸出正確的結(jié)果"12345"
            /*The strcpy function copies strSource, including the terminating null character, to the location specified by strDestination. No overflow checking is performed when strings are copied or appended. The behavior of strcpy is undefined if the source and destination strings overlap.*/
            char * __cdecl strcpy(char * dst, const char * src) 

            char * cp = dst; 

            while*cp++ = *src++ ) 
            /* Copy src over dst */ 

            return( dst ); 
            }
             
            貌似strcpy雖然不進(jìn)行越界處理,仍然是個挺好的函數(shù)呢,但是注意了,下面的代碼就能暴露出strcpy 的缺點(diǎn)了.
            char p[5];
            char *= "12345678";
            strcpy(p,s);
            cout 
            << p <<endl; //輸出12345678,而不是我們所設(shè)想的12345
            為了不因不知s的長度而犯下錯誤,推薦使用strncpy。但是是不是用了strncpy就萬無一失了呢?看下面的代碼:
            char p[5];
            char* s = "12345";
            strncpy(p,s,
            5);
            cout 
            << p <<endl; //12345*&^(后面表示亂碼)
            不是都限制個數(shù)了么?為什么后面又有亂碼?
            問題來自在上述情形strncpy是不會復(fù)制字符串s后面的null的,不是以null結(jié)束的p不會輸出正確結(jié)果的。
            仍然給出strncpy的源代碼:
            /*The strncpy function copies the initial count characters of strSource to strDest and returns strDest. If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string. If count is greater than the length of strSource, the destination string is padded with null characters up to length count. The behavior of strncpy is undefined if the source and destination strings overlap.*/
            char * __cdecl strncpy ( char * dest, const char * source, size_t count ) 

            char *start = dest; 

            while (count && (*dest++ = *source++)) /* copy string */ 
            count
            --

            if (count) /* pad out with zeroes */ 
            while (--count) 
            *dest++ = '\0'

            return(start); 
            }
             
            那strncpy這么不穩(wěn)定,為何用它?strncpy經(jīng)常用于修改一個長字符串中間的一部分(看出不復(fù)制null的原因了吧!),如果實(shí)在要用到上述的代碼上,就在代碼最后加上p[5] = '\0'; 吧!

            posted on 2009-04-26 20:59 幸運(yùn)草 閱讀(3366) 評論(1)  編輯 收藏 引用 所屬分類: C++

            評論

            # re: 深入理解strcpy,strncpy 2009-12-12 14:04 小螞蟻

            不是strncpy不穩(wěn)定
            數(shù)組長度不夠,讓strncpy越界再加個\0 ?
              回復(fù)  更多評論   

            久久国产精品久久国产精品| 久久夜色精品国产噜噜麻豆| 日韩久久久久久中文人妻 | 久久99精品国产| 久久青青草原精品国产不卡| 久久亚洲AV成人出白浆无码国产| 国内精品人妻无码久久久影院| 久久综合九色综合欧美就去吻| 亚洲中文字幕久久精品无码APP | 91精品国产综合久久婷婷| 亚洲人成伊人成综合网久久久 | 久久精品国产亚洲av瑜伽| 97久久精品无码一区二区天美| 久久精品亚洲福利| A狠狠久久蜜臀婷色中文网| 久久亚洲AV成人无码软件| 亚洲精品成人网久久久久久| 久久免费精品视频| 精品精品国产自在久久高清| 久久久噜噜噜久久中文字幕色伊伊| 99久久免费国产精品特黄| 狠狠人妻久久久久久综合蜜桃| 亚洲国产精久久久久久久| 精品久久久无码中文字幕天天 | 色婷婷综合久久久久中文字幕| 欧美激情精品久久久久久久九九九 | 久久综合色之久久综合| 久久AAAA片一区二区| 精品久久久久久无码中文字幕| 国产精品福利一区二区久久| 国产∨亚洲V天堂无码久久久| 日本人妻丰满熟妇久久久久久| 波多野结衣久久一区二区| 亚洲国产精品无码久久青草| 日韩va亚洲va欧美va久久| 伊人 久久 精品| 中文字幕乱码久久午夜| 久久精品中文无码资源站 | 99久久99久久| 久久免费视频观看| 久久久久亚洲AV成人网人人网站 |