C語言複習(十四) C語言中的字串

2021-06-22 11:52:25 字數 2307 閱讀 2746

嚴格來講,c

語言中不存在字串資料型別,都是以字元陣列來模擬字串的;

c語言中字串是以』\0』結束的字元陣列;

c語言中的字串可以分配於棧空間、堆空間、或者唯讀儲存區;

如下示例:

#include #include int main()

; //str1不是字串,因為它不包含'\0',它只是乙個字元陣列

char str2=;

char* str="hello world!";

char *pstr=(char*)malloc(sizeof(char)*20);

char* p=str2;

char* p1=pstr;

while(*p!='\0')

printf("%s\n",pstr);

return 0;

}

字串的長度指的是字串中所包含的字元的個數,在c

語言中即是字串中第乙個』\0』出現前的字元個數,不包含這個』\0』結束符;

c語言通過』\0』結束符來確定字串長度;

定義字元指標變數並初始化時,不用手動新增這個結束符』\0』,編譯器會預設新增;

c語言標準庫函式

string.h

標頭檔案中已經有乙個函式

strlen()

可以完成這個工作,那麼如何自己實現

strlen()

函式呢?

#include #include size_t _strlen(const char* str)

return length;}

int main()

注意,和標準庫提供的strlen

函式一樣,這裡的返回值為

size_t

型別,通過檢視定義可知它是乙個無符號整型,因此使用時注意!如下就有錯誤:

#include #include int main()

else

if ((strlen(s1) - strlen(s)) >= 0)

else

return 0;

}

執行結果:

分析程式,兩個條件判斷初看都應該會輸出完整的」hello world!」;可是為什麼第二個條件判斷卻輸出了」hello」??

問題出在了strlen

函式的返回值型別上,

size_t

型別實際上是乙個

unsigned int

型別,那麼第二個條件語句中:

strlen(s1) - strlen(s)

,計算的結果也是乙個無符號的整數,因此它一定大於等於0!

上面,我已經給出了乙個實現strlen

函式的方法,要想用一條語句實現,我們可以試著對它進行精簡和改進:

先給出最終的實現:

int _strlen(const char* str)

簡單分析一下:

回顧一下,上面的第乙個方法,原理是當前指標所指向的儲存單元的值不為』\0』那麼長度就加1

,知道遇到』\0』就停止。

現在要求用一條語句,肯定不能再使用這種方法,要換一種演算法並配合遞迴呼叫,基本原理是:如果當前指標指向的儲存空間的字

符不為『\\0

』,那麼整個字串的長度就應該等於指標

str+1

所指向的長度

+1;利用這種演算法加遞迴呼叫配合三目運算子就可以實現

了,但是在計算字串長度前,應該進行安全性檢查,判斷字串是否為空,因此還要配合逗號表示式,最終的結果如上所示!

char* _strcpy(const char* str,const char* newstr)

只是注意上面的while迴圈就行,其他都比較簡單!

C語言字串(複習)

字串 用雙引號括起來的就是字串 字元常量 用單引號括起來的就是字元常量 abc 字串 abac 字元常量輸入輸出函式 字串的輸入輸出可以呼叫庫函式 1 gets和puts gets 函式輸入字元時,只有遇到回車符才認為字串入結束 puts 函式輸出時,遇到第乙個 0 就結束輸出 2 scanf和pr...

C語言中的字串

從概念上講,c語言中沒有字串型別 在c語言中使用字元陣列來模擬字串 c語言中的字串是以 0 結束的字元陣列 c語言中的字串可以分配於棧空間,堆空間或者唯讀儲存區 char s1 沒有 0 所以s1只不過是個單純的字元陣列 char s2 也是乙個字元陣列,但是最後乙個元素是 0 因此s2就成了c語言...

c語言中的字串

一 c語言中的字串 c語言中沒有字串型別 字串實際就是多個字元連在一起,所有可以用字元陣列來存放字串。但是使用字元陣列輸出時需要使用for迴圈 例如 這樣使用十分不方便,有沒有一種簡約的方式,讓我們一下子就能輸出呢?有但是需要改兩個地方!1.長度要 1 2.末尾要加乙個 0 然後用 s 格式化控制符...