C語言學習筆記 16 c語言字串分析

2021-07-07 05:38:20 字數 2864 閱讀 7116

摘要:總結了字串的概念,字串長度的計算方法,嘗試實現了strlen和strcpy函式,最後介紹了受限和不受限的字串函式。

一、字串的概念

1.從概念上講,c語言中並沒有字串這一型別,它使用字元陣列末尾加』\0』來模擬字串。

2.c語言中的字串是以』\0』結尾的字元陣列。

3.c語言中的字串可以分配於棧空間,堆空間或者唯讀儲存區。

這裡的字串分配於棧空間,堆空間或者唯讀儲存區,是因為我們建立字串的方式不同,例如使用陣列,則是在棧空間分配,使用指標+malloc我們還在堆空間,如果只是char *s1=」hello」;那麼就是在唯讀儲存區了,這時候如果嘗試改變它的值,就會出現段錯誤。

例如下面的例子:

#includeintmain(void)

編譯不會報錯,但是執行就會出錯,這裡其實也可以理解為,並沒有給s1分配記憶體空間。

二、字串的長度

1.字串的長度其實就是字串所包含的字元的個數。

2.字串的長度指的是第乙個』\0』出現前,所包含的字元的個數。

3.c語言通過』\0』來確定字串的長度。

下面的例子:

#include #include int main(void)

最終結果輸出如下:

length=5

sizeis:100

可以看到長度是只認』\0』,但是陣列的大小就是我們分配的記憶體空間的大小,這裡strlen的函式原型如下:

size_tstrlen(const char *s)

return length;

}

assert是用來判斷字串是否為空的函式,如果為空,程式就結束。

注意:使用strlen比較兩個字串大小的時候,不要使用strlen(a)-strlen(b)這種格式,因為strlen的返回值是乙個無符號型別的,所以他們相減的值永遠不會出現負數,所以無論a和b的大小怎樣,都會預設a比b大,這種比較應當使用》方法比較。

三、一條語句實現strlen

首先複習兩個知識點:

第一:逗號表示式,從左往右依次計算表示式,整個過程的值以最後乙個表示式的值為準。

第二:三目運算子,對於條件表示式b?x:y,先計算條件b,然後進行判斷。如果b的值為true,計算x的值,運算結果為x的值;否則,計算y的值,運算結果為y的值。

實現語句如下:

size_t strlen(const char *s)

首先利用逗號表示式,判斷s是否為空,為空的話程式就會出錯,後面的三目運算子,利用了遞迴的思想,其實是首先判斷*s是否成立,如果不為0的話,就執行下一句strlen(s+1)+1,這是什麼意思呢?我的理解是把指標移動一位,判斷下乙個是否為真,也就是是否為0,就是使用了判斷和移位,也就是while(s++)這個語句被代替了,一直判斷,往裡遞迴,知道遇到\0,這樣最後返回的值+1,就得到字串的長度,之所以加1,是因為我們是從s+1開始遞迴進去。

不過,一般不要使用自己寫的庫函式去替換原有的函式,因為有時候這些函式會使用彙編**加快機器執行的速度,復用他們效率會更高。

四、不受限制的字串函式

不受限制的字串函式是通過尋找字串中的』\0』來判斷字串的長度。

這些函式的輸入引數中必須包含』\0』;

strcpy和strcat目標字串必須要保證有足夠的分配到的空間來存放原始檔字串。

strcmp在比較兩個字串大小的時候,相等返回0,大於返回正數,小於返回負數。strcmp不會修改引數的值,但是依然以』\0』作為結束符。

例如:字串複製:char* strcpy(char* dst,const char* src)

字串比較:int strcmp(constchar* dst,const char* src)

五、實現strcpy

#include #include char* strcpy(char* dst,const char* src)

int main(void)

六、長度受限的字串函式

長度受限的字串函式接收乙個顯示的長度引數用於限定操作的字元數,例如下列函式:

字串複製:char* strncpy(char*dst, const char* src, size_t len);

字串連線:char* strncat(char* dst, const char* src , size_tlen);

字串比較:int strncmp(const char* s1, const char*s2 ,size_t len);

其中:strncpy只複製len個字元到目標字串。

當源字串的長度小於len時,剩餘的空間以』\0』填充。

當源字串的長度大於len時,只有len個字元會被複製,且它將不會以』\0』結束。

strncat最多從源字串中複製len個字元到目標串中

strncat總是在結果字串後面新增』\0』

strncat不會用』\0』填充目標串中的剩餘空間

strncmp只比較len個字元是否相等

其實這些受限的字串函式,就是比之前的不受限制的多了乙個n,這個n就是代表受限的大小,很容易理解,需要注意的就是關於空間不足或者多了的時候是怎麼處理的,cpy會填充』\0』,cat則不會,只會以』\0』結束,當時cpy空間不足的時候,就只會複製len個,並且不會以』\0』結束。

這篇帖子就總結到這裡吧,如有不正確的地方還請指出,大家共同進步!

16 C語言 指標

學習 c 語言的指標既簡單又有趣。通過指標,可以簡化一些 c 程式設計任務的執行,還有一些任務,如動態記憶體分配,沒有指標是無法執行的。include int main 當上面的 被編譯和執行時,它會產生下列結果 通過上面的例項,我們了解了什麼是記憶體位址以及如何訪問它。接下來讓我們看看什麼是指標。...

c語言 字串陣列 C語言學習路線

c語言學習路線 了解c語言 c語言歷史 c語言特點 演算法什麼是演算法 演算法怎麼描述 資料型別 變數命名規則 基本資料型別有哪些 常量 變數 運算子與表示式 什麼是表示式 什麼是運算子 運算子和表示式有什麼關係 常用輸入輸出函式 字元,字串輸入輸出 其他型別格式化輸出 選擇程式結構 if語句 if...

C語言學習 字串

字串宣告 char 變數名 數量 示例 include intmain printf 輸出字串ch2 s n ch2 方法3 char ch3 省略字串長度,長度編譯器在編譯時會幫忙計算 printf 輸出字串ch3 s n ch3 方法4 char ch4 name 此時末尾不需要加上 0 大括號...