• <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>
            隨筆-145  評論-173  文章-70  trackbacks-0

            C/C++中的字符串字面值

             

            1.     字符串?dāng)?shù)組的大小如何得到。我們都知道,對于一個(gè)字符串?dāng)?shù)組,要得到它的大小,有多種辦法,常見的有下面的兩種。

            .利用sizeof運(yùn)算符來實(shí)現(xiàn)。現(xiàn)在假設(shè)有一個(gè)字符數(shù)組str[] = “hello,world”,為了得到的它的長度,我們利用這種辦法

            具體就是sizeof(str) /sizeof(char);結(jié)果是12,比較發(fā)現(xiàn),實(shí)際的字符串大小事11啊,為什么會得到12的結(jié)果呢?

            有這種疑問,是因?yàn)閷ξ覀冏址麛?shù)組沒有一個(gè)更好的理解。上面初始化一個(gè)字符數(shù)組,是利用字符串來初始化的,

            而字符串的話,默認(rèn)的是會有一個(gè)以null結(jié)尾的標(biāo)志,這個(gè)具體的就是’\0’,有很多人的程序有問題,可能都是因?yàn)檫@里

            出現(xiàn)了問題,比如數(shù)組沒有封口,造成了指針非法訪問其他內(nèi)存單元,等等。所以實(shí)際上的長度就是12.

            具體來說說這個(gè)原理吧:sizeof是表示計(jì)算大小,即字節(jié)數(shù)。這里以一個(gè)數(shù)組名來作為參數(shù),就是計(jì)算這個(gè)數(shù)組的大小。

            上面說到,字符串?dāng)?shù)組的話是有一個(gè)默認(rèn)的null來封口的,所以,計(jì)算的大小事包括這個(gè)單元的。于是sizeof(str)的大小

            就是12 個(gè)字節(jié),然后計(jì)算一個(gè)單元,即一個(gè)字符char類型的占據(jù)的字節(jié)數(shù),也就是1個(gè)字節(jié),兩者相除,就是12的結(jié)果。

            .利用循環(huán)來實(shí)現(xiàn),這個(gè)部分是很多人都常常想到的。因?yàn)橐粋€(gè)字符串來定義的數(shù)組,默認(rèn)是以null即為的,所以,通過               循環(huán)遍歷的方式來實(shí)現(xiàn),這個(gè)方法還是可行的。定義一個(gè)變量i,然后利用for循環(huán),判斷str[i]不為’\0’,即可判斷              得到最后一個(gè)元素的下標(biāo),注意到的是這里是最后一個(gè)字符元素,但是不是最后一個(gè)真正的元素,有一個(gè)null,因此,還                要加上1才是真正的個(gè)數(shù),經(jīng)過這個(gè)過程,得到的就是總的長度。這個(gè)方法比較容易理解。但是容易忽略了最后一個(gè)的作用。                                                                                                實(shí)際上,我們使用的很多C提供的函數(shù),關(guān)于字符串操作的,都需要用到這個(gè)知識,我們在做計(jì)算的時(shí)候,很容易誤以為返                    回的。就是那個(gè)字符串的長度,從而導(dǎo)致了錯誤。實(shí)際在我們拷貝字符串的時(shí)候,尤其要注意這一點(diǎn)。

             

            2.  在《C++ Primer》一書中,將以null結(jié)束的字符數(shù)組稱為字符數(shù)組,標(biāo)準(zhǔn)庫提供一批處理這類字符數(shù)組的函數(shù),包括strlen,strcmp,strcat,strcpy,strncat,strncpy等等,而這些函數(shù)中的參數(shù),都是以null結(jié)束的字符數(shù)組名,也就是字符數(shù)組的指針,而得到長度,返回的就是一個(gè)長度,沒有包括null這個(gè)單元,所以實(shí)際上,上面的那個(gè)還有一個(gè)方法,可以調(diào)用此函數(shù)來實(shí)現(xiàn)。當(dāng)然,還有一點(diǎn)要注意的是,strcat連接函數(shù),將右邊的字符串連接到左邊,所以對于左邊的字符串,一定要準(zhǔn)確的計(jì)算出長度,如果不慎,就會溢出,出現(xiàn)嚴(yán)重的錯誤。看看下面這個(gè)例子:

            Char s1[25] = “hello,world”;  char s2[20] = “0123456789012345678”(剛好是20個(gè)字符,為何,因?yàn)橛幸粋€(gè)null).所以現(xiàn)在的那個(gè)s2[20] = “01234567890123456789”,此時(shí)你會發(fā)現(xiàn),字符串就有20個(gè),含有一個(gè)null,注意就溢出了,OK

            下面,如果我將上面的那個(gè)采用字符串連接函數(shù)來做,就是strcat(s1,s2),那么又會出現(xiàn)錯誤。因?yàn)橐绯隽恕?span lang=EN-US>

            3.C++中提供了一個(gè)標(biāo)準(zhǔn)庫string來處理字符串,這個(gè)string類提供了很多操作,是一種更安全的做法,然而了,為了新舊代碼的兼容,需要進(jìn)行兩者之間的轉(zhuǎn)換,而把string的一個(gè)類函數(shù)c_str()返回值是C風(fēng)格字符串。const char *str = st2.c_str();其中st2是一個(gè)string類型的對象,返回值就是一個(gè)指向它的字符串。 此即為字符串的處理,作為C/C++的字符串值得注意的地方。                                                 

            posted on 2009-12-27 18:48 deercoder 閱讀(1368) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            精品国际久久久久999波多野| 国产福利电影一区二区三区久久久久成人精品综合 | 国产成人无码精品久久久性色| 亚洲国产成人乱码精品女人久久久不卡 | 久久亚洲中文字幕精品一区| 精品一久久香蕉国产线看播放| 久久亚洲av无码精品浪潮| 久久精品麻豆日日躁夜夜躁| av无码久久久久久不卡网站| 欧美亚洲另类久久综合婷婷| 国产Av激情久久无码天堂| 亚洲国产成人久久综合野外| 7777久久亚洲中文字幕| 色综合久久夜色精品国产| 久久精品免费观看| 国产毛片欧美毛片久久久| 国产真实乱对白精彩久久| 91久久婷婷国产综合精品青草| 久久久噜噜噜久久| 久久久久久无码Av成人影院| 爱做久久久久久| 久久精品国产69国产精品亚洲| 久久不见久久见免费视频7| 久久九九兔免费精品6| 久久夜色精品国产亚洲av| 91亚洲国产成人久久精品网址| 国产精品久久久久9999高清| 色综合久久无码中文字幕| 77777亚洲午夜久久多喷| 东方aⅴ免费观看久久av| 99久久香蕉国产线看观香| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久人人爽人人人人片av| 午夜福利91久久福利| 久久97久久97精品免视看| 无码专区久久综合久中文字幕| 亚洲精品乱码久久久久久自慰| 日韩精品无码久久久久久| 人妻精品久久无码区| 国产精品久久久久9999高清| 精品久久久久中文字幕一区|