• <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.     字符串數組的大小如何得到。我們都知道,對于一個字符串數組,要得到它的大小,有多種辦法,常見的有下面的兩種。

            .利用sizeof運算符來實現。現在假設有一個字符數組str[] = “hello,world”,為了得到的它的長度,我們利用這種辦法

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

            有這種疑問,是因為對我們字符數組沒有一個更好的理解。上面初始化一個字符數組,是利用字符串來初始化的,

            而字符串的話,默認的是會有一個以null結尾的標志,這個具體的就是’\0’,有很多人的程序有問題,可能都是因為這里

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

            具體來說說這個原理吧:sizeof是表示計算大小,即字節數。這里以一個數組名來作為參數,就是計算這個數組的大小。

            上面說到,字符串數組的話是有一個默認的null來封口的,所以,計算的大小事包括這個單元的。于是sizeof(str)的大小

            就是12 個字節,然后計算一個單元,即一個字符char類型的占據的字節數,也就是1個字節,兩者相除,就是12的結果。

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

             

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

            Char s1[25] = “hello,world”;  char s2[20] = “0123456789012345678”(剛好是20個字符,為何,因為有一個null).所以現在的那個s2[20] = “01234567890123456789”,此時你會發現,字符串就有20個,含有一個null,注意就溢出了,OK

            下面,如果我將上面的那個采用字符串連接函數來做,就是strcat(s1,s2),那么又會出現錯誤。因為溢出了。

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

            posted on 2009-12-27 18:48 deercoder 閱讀(1351) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            亚洲国产成人久久笫一页| 久久精品国产99久久无毒不卡| 日日噜噜夜夜狠狠久久丁香五月| 久久久久99精品成人片| 一本一道久久a久久精品综合| 久久综合九色综合欧美就去吻| 精品国产99久久久久久麻豆| 久久久久人妻一区精品性色av| 免费国产99久久久香蕉| 性做久久久久久久久| 丰满少妇高潮惨叫久久久| 欧美一级久久久久久久大| 精品国际久久久久999波多野| 国产午夜精品理论片久久| 狠狠色噜噜色狠狠狠综合久久| 99久久精品国产麻豆| 久久久久久精品免费免费自慰| 色婷婷久久综合中文久久蜜桃av| 国内精品久久久久久中文字幕| 亚洲精品无码久久千人斩| 亚洲&#228;v永久无码精品天堂久久 | 久久精品成人一区二区三区| 狠狠色婷婷久久综合频道日韩| 国产免费久久精品99久久| 亚洲欧美成人综合久久久| 亚洲精品97久久中文字幕无码| 久久久久久久99精品免费观看| 亚洲av伊人久久综合密臀性色| 国产精品久久久久久五月尺| 久久久久99精品成人片三人毛片 | 亚洲欧美伊人久久综合一区二区 | 欧美久久久久久| 久久99精品久久久久久9蜜桃 | 亚洲国产精品综合久久一线| 99久久精品免费看国产一区二区三区| 色狠狠久久AV五月综合| 狠狠色丁香婷婷久久综合五月| 一级女性全黄久久生活片免费| 欧美国产精品久久高清| 久久久噜噜噜久久中文字幕色伊伊| 婷婷国产天堂久久综合五月|