• <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++

            最新評(píng)論

            深入理解strcpy,strncpy

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

            看到這樣一個(gè)改錯(cuò)題:
            char p[5]; 
            char* s="12345"
            strcpy(p,s);
               cout << p << endl;
            錯(cuò)誤之處是很顯然的,作為字符串字面值的"12345"會(huì)在結(jié)尾處自動(dòng)加上空字符null,從而長(zhǎng)度是6,上面的strcpy是會(huì)越界的,從而是個(gè)越界錯(cuò)誤。
            問題是我以為這樣的程序編譯的時(shí)候會(huì)出錯(cuò)呢!但是我在vc上運(yùn)行時(shí)是可以輸出正確結(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)行越界處理,仍然是個(gè)挺好的函數(shù)呢,但是注意了,下面的代碼就能暴露出strcpy 的缺點(diǎn)了.
            char p[5];
            char *= "12345678";
            strcpy(p,s);
            cout 
            << p <<endl; //輸出12345678,而不是我們所設(shè)想的12345
            為了不因不知s的長(zhǎng)度而犯下錯(cuò)誤,推薦使用strncpy。但是是不是用了strncpy就萬(wàn)無(wú)一失了呢?看下面的代碼:
            char p[5];
            char* s = "12345";
            strncpy(p,s,
            5);
            cout 
            << p <<endl; //12345*&^(后面表示亂碼)
            不是都限制個(gè)數(shù)了么?為什么后面又有亂碼?
            問題來自在上述情形strncpy是不會(huì)復(fù)制字符串s后面的null的,不是以null結(jié)束的p不會(huì)輸出正確結(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)常用于修改一個(gè)長(zhǎng)字符串中間的一部分(看出不復(fù)制null的原因了吧!),如果實(shí)在要用到上述的代碼上,就在代碼最后加上p[5] = '\0'; 吧!

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

            評(píng)論

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

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

            2021国产精品久久精品| 久久久久久一区国产精品| 久久国产精品免费一区| 亚洲国产成人久久精品99| 伊人久久大香线蕉综合影院首页 | 久久WWW免费人成一看片| 久久精品人妻中文系列| 狠狠色婷婷久久综合频道日韩| 77777亚洲午夜久久多人| 久久亚洲欧美日本精品| 久久99精品国产自在现线小黄鸭 | 久久久久99精品成人片试看| 久久精品国产精品亚洲下载| av色综合久久天堂av色综合在| 久久er国产精品免费观看2| 久久99精品国产麻豆宅宅| 日本免费一区二区久久人人澡 | 亚洲精品国产成人99久久| 久久久国产乱子伦精品作者| 久久久久久久久久免免费精品| 久久精品国产亚洲77777| 香蕉久久夜色精品国产尤物| 欧美久久久久久午夜精品| 国产精品综合久久第一页| 久久精品aⅴ无码中文字字幕重口| 欧美大战日韩91综合一区婷婷久久青草| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 国产精品久久成人影院| 国产成人精品久久二区二区| 大香伊人久久精品一区二区| 久久久久噜噜噜亚洲熟女综合| 97久久精品国产精品青草| 国产午夜精品久久久久免费视| A级毛片无码久久精品免费| 久久久久久久精品成人热色戒| 日本欧美国产精品第一页久久| 久久亚洲天堂| 久久久久青草线蕉综合超碰| 亚洲欧洲日产国码无码久久99| 久久精品国产亚洲av日韩| 久久丫精品国产亚洲av|