C風格字串

2023-07-08 18:00:18

image

C風格字串

關於C風格字串的問題

❓C++有string為什麼還要學習C風格字串?

  1. 某些場景使用C風格字串更方便、更高效
  2. C標準庫、Linux庫 、開源庫和資料庫的介面函數,一定有C語言但不一定有C++(MySQL的介面函數只有C而沒有C++)
  3. String是類,封裝了C風格字串(學習C風格字串能幫助理解String類)

C中字元陣列與字串的區別

C中字串的末尾會有**'/0' ​**,而字元陣列沒有

char name[21]; 	//字串,最多存放20個英文字元或10箇中文字元,最後一個字元為 ' /0 ' 

C風格字串的使用

字串的初始化

char name[11];			//未初始化,其值為垃圾直
char name[11] = "Hello";	//初始化為Hello,系統自動在末尾新增'/0'
char name[11] = {"Hello"}; //初始化為Hello,系統自動在末尾新增'/0'
char name[] = {"Hello"};	//初始化為Hello,系統自動在末尾新增'/0'
char name[11]   {"Hello"};	//初始化為Hello,系統自動在末尾新增'/0'(C++ 11 標準)
char name[11] = {0};		//全部元素初始化為0

清空字串

使用memset()​函數清空字串

語法:memset(字元陣列的首地址即陣列名,0,陣列記憶體的空間大小)

char name[10];
memset(name,0,sizeof(name));
//結果
0 0 0 0 0 0 0 0 0 0 

字串複製或賦值

❗C語言字串不能用" = "賦值

strcpy()函數

語法:strcpy(目標字串,源字串)

返回值:返回目標字串的首地址

⚠複製完字串後,會自動在目標字串後面追加' /0 '

 如果目標字串所指向的記憶體不夠大,則會導致陣列越界
char name[11] = {"Hello"};
char namecpy[11];
strcpy(namecpy,name);
//結果
namecpy[11]——>Hello

strncpy()函數

語法:strncpy(目標字串,源字串,n個字元)

返回值:返回目標字串的首地址

⚠如果源字串小於n,則拷貝完後會在目標字串後追加' /0 '

 如果源字串大於或等於n,則擷取前n個字元,且不會再目標字串後追加' /0 '

如果目標字串所指向的記憶體不夠大,則會導致陣列越界

char name[11] = {"Hello"};
char namecpy[11];
strcpy(namecpy,name,3);
//結果
namecpy[11]——>Hel

字串長度

語法:strlen(字串的首地址即字串名)

char name [11] = { "Hello" };
cout << strlen(name) << endl;
//輸出結果
5		//檢索到'/0'時結束

字串拼接

strcat()函數

語法:strcat(目標字串,源字串) ​​==目標字串原有的'/0'會被覆蓋掉==

char firstname[10] = {"Hello"};
char lastname[10] = {" World"};
strcat(firstname,lastname);
//執行結果
Hello World

strncat()函數

語法:strcat(目標字串,源字串,n個字元) ​​==目標字串原有的'/0'會被覆蓋掉==

char firstname[10] = {"Hello"};
char lastname[10] = {" World"};
strcat(firstname,lastname,2);
//執行結果
Hello Wo

字串比較

目標字串與源字串(或源字串前n個字元)比較 返回值
> 1(ASCII碼的差)
= 0
< -1(ASCII碼的差)

strcmp()函數

語法:strcmp(目標字串,源字串)

char name1[10] = {"Hello"};
char name2[10] = {"hello"};
strcmp(name1,name2);
//執行結果
-32

strncmp()函數

語法:strcmp(目標字串,源字串,前n個字元)

char name1[10] = {"Hello"};
char name2[10] = {"hello"};
strcmp(name1,name2,3);
//執行結果
-32

字元查詢

strchr(字串,要查詢的字元) 【是從一個字串str中第一次出現該字元character的位置】

strrchr(字串,要查詢的字元)【是從一個字串str中最後一次出現該字元character的位置】

返回值:如果在字串 str 中找到字元 c,則函數返回指向該字元的指標,存在和首地址相減,可以得到下標。如果未找到該字元則返回 NULL。

字串查詢

語法:strstr(字串,子串)

返回值:返回子串在字串中第一次出現的地址,沒有返回0

⚠C風格字串的注意事項

5⃣在VS中使用C風格字串是應加上#define _CRT_SECURE_NO_WARNINGS

1⃣字串的結尾標誌為'/0',在處理時會從起始位置開始搜尋直到搜尋到'/0'為止

不會判斷陣列越界的原因:

操作字串的函數形參為指標,只存放了字串的起始地址,沒有字串的長度引數,無法判斷是否越界

2⃣結尾識別符號'/0'後面都是垃圾值

3⃣字串在每次使用前都要初始化

4⃣不要再子函數裡面使用sizeof運運算元(因為子函數中的引數為指標,總是佔8位元組(64位元作業系統))