1. 程式人生 > >C和C指針小記(十四)-字符串、字符和字節

C和C指針小記(十四)-字符串、字符和字節

新的 可能 c指針 str 整型 分配內存 img 庫函數 bubuko

1、字符串

C語言沒有字符串數據類型,因為字符串以字符串常量的形式出現或存儲於字符數組中.
字符串常量和適用於那些程序不會對他們進行修改的字符串.
所有其他字符串都必須存儲於字符串數組或動態分配的內存中.
字符串是一個或多個字符,並且以一個位模式全0 的NUL字節結尾
頭文件 string.h 包含了使用字符串函數所需的原型和聲明.

2、字符串長度

用庫函數 strlen 計算字符串長度
size_t strlen(char const *string);
size_t 是一個無符號整型,在stddef.h中定義.
警告:

if( strlen( x ) >= strlen( y ) ) //1
if( strlen( x ) - strlen( y ) >= 0)//2

第一條語句可以正常工作
第二天語句永遠是真. 因為strlen的結果是個無符號數,所以操作符 >= 左邊的表達式也將是無符號數,而無符號數絕對不可能是負的.
把strlen的返回值強制轉換為int可以消除這個問題,但是不推薦.

//計算字符串參數的長度
size_t strlen (char const *string){
    int length;
    for( length = 0; *string++ != ‘\0‘;)
        length += 1;
    return length;
}

3、不受限制的字符串函數

最常用的字符串函數都是“不受限制”的,就是說他們值是通過尋找字符串參數結尾的NUL字節來判斷它的長度.
這些函數一般都指定一塊內存用於存放結果字符串.在使用這些函數時,程序員必須保證結果字符串不會溢出這塊內存.

3.1 復制字符串

char strcpy(char det, char const *src);
這個函數把參數src字符串復制到dst參數.如果參數src和dst在內存中出現重疊(也就是兩者相同),其結果是為定義的.
由於dst參數將進行修改,所以它必須是個字符數組或者一個指向動態分配內存的數組指針,不能使用字符串常量.
目標參數的之前的內容將被覆蓋並丟失.即使新的字符串比dst原先的內存更短,由於新字符串是以NUL字節結尾,所以老字符串最後剩余的幾個字符也會被有效地刪除
例子:
char message[] = "Original message";
...
if(...)
strcpy(message, "Different" );
如果if條件為真,並且順利復制,數組將包含以下的內容:
技術分享圖片

C和C指針小記(十四)-字符串、字符和字節