本章重點
重點介紹處理字符和字符串的庫函數的使用和注意事項
1.求字符串長度 strlen
2.長度不受限制的字符串函數 strcpy ,strcat, strcmp
3.長度受限制的字符串函數 strncpy,strncat ,strncmp
4.字符串查找 strstr,strtok
5.錯誤信息報告 strerror
6.字符操作
7.內存操作函數 memcpy,memmove,memset ,memcmp
前言
C語言中對字符和字符串的處理很是頻繁,但是C語言本身是沒有字符串類型的,字符串通常放在 常量字符串 中或者 字符數組 中。 字符串常量 適用于那些對它不做修改的字符串函數。
1.strlen函數
size_t strlen ( const char * str );
- 字符串已經 '\0' 作為結束標志,strlen函數返回的是在字符串中 '\0' 前面出現的字符個數(不包含 '\0' )。
- 參數指向的字符串必須要以 '\0' 結束。
- 注意函數的返回值為size_t,是無符號的( 易錯 )
- 學會strlen函數的模擬實現 (計數器、指針-指針、遞歸)
講解:
注意點1
有的編譯器可能用int來接收strlen函數的返回值會報錯,因為strlen函數返回值是size_t( unsigned int 無符號整型 )
1
2
3
4
5
|
char arr[] = "abcdef" ; //錯誤示范 int sz1 = strlen (arr); //正確示范 size_t sz = strlen (arr); |
注意點2
注意函數的返回值為size_t,是無符號的( 易錯 )
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//3 - 8 < 0? //strlen函數是size_t類型,是無符號的,必定大于0?。?! int main() { if ( strlen ( "abc" ) - strlen ( "abcdefgh" ) > 0) { printf ( "哈哈哈~~" ); } else printf ( "吼吼吼!" ); return 0; } //運行結果是 哈哈哈~~ |
對比代碼:
1
2
3
4
5
6
7
8
9
10
11
|
int main() { if (( int ) strlen ( "abc" ) - ( int ) strlen ( "abcdefgh" ) > 0) { printf ( "哈哈哈~~" ); } else printf ( "吼吼吼!" ); return 0; } //運行結果是 吼吼吼! |
2.strcpy
char* strcpy(char * destination, const char * source );
- 源字符串必須以 '\0' 結束。
- 會將源字符串中的 '\0' 拷貝到目標空間。
- 目標空間必須足夠大,以確保能存放源字符串。
- 目標空間必須可變。( 即:不能是不可修改的常量字符串 )
- 學會模擬實現。
講解:
注意點1:
我們發現,copy時,將源字符串毫無保留的( 包括末尾的 '\0' )一塊copy到目標字符串中?。?/p>
注意點2:
如果源字符串中間本身就含有'\0',那么我們同樣還是取到遇見的第一個‘\0' ,不會繼續往后打印的?。。?/p>
注意點3:
目標空間必須足夠大,以確保能存放源字符串。
1
2
3
4
5
|
//錯誤示范 //目標字符串空間太少 char arr1[] = "xxx" ; char arr2[] = "hello\0abc" ; strcpy (arr1, arr2); |
注意點4:
目標空間必須可變。
模擬strcpy函數
代碼1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include<stdio.h> #include<assert.h> void * my_strcpy( char * dest, const char * src) { assert (dest && src); char * ret = dest; while (*src) { *dest = *src; dest++; src++; } *dest = '\0' ; } int main() { char arr1[] = "xxxxxxxxxxxxxxxx" ; char arr2[] = "abc" ; my_strcpy(arr1, arr2); printf ( "%s" , arr1); return 0; } |
代碼2:(升級版~~)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include<stdio.h> #include<assert.h> char * my_strcpy( char * dest, const char * src) { assert (dest && src); char * ret = dest; while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[] = "xxxxxxxxxxxxxxxx" ; char arr2[] = "abc" ; printf ( "%s" , my_strcpy(arr1, arr2)); return 0; } |
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!
原文鏈接:https://blog.csdn.net/weixin_52377137/article/details/120313898