C語言字符函數(shù)與字符串函數(shù)詳解
本章重點
重點介紹處理字符和字符串的庫函數(shù)的使用和注意事項
1.求字符串長度 strlen
2.長度不受限制的字符串函數(shù) strcpy ,strcat, strcmp
3.長度受限制的字符串函數(shù) strncpy,strncat ,strncmp
4.字符串查找 strstr,strtok
5.錯誤信息報告 strerror
6.字符操作
7.內(nèi)存操作函數(shù) memcpy,memmove,memset ,memcmp
前言
C語言中對字符和字符串的處理很是頻繁,但是C語言本身是沒有字符串類型的,字符串通常放在 常量字符串 中或者 字符數(shù)組 中。 字符串常量 適用于那些對它不做修改的字符串函數(shù)。
1.strlen函數(shù)
size_t strlen ( const char * str );
- 字符串已經(jīng) '\0' 作為結(jié)束標志,strlen函數(shù)返回的是在字符串中 '\0' 前面出現(xiàn)的字符個數(shù)(不包含 '\0' )。
- 參數(shù)指向的字符串必須要以 '\0' 結(jié)束。
- 注意函數(shù)的返回值為size_t,是無符號的( 易錯 )
- 學會strlen函數(shù)的模擬實現(xiàn) (計數(shù)器、指針-指針、遞歸)
講解:
注意點1
有的編譯器可能用int來接收strlen函數(shù)的返回值會報錯,因為strlen函數(shù)返回值是size_t( unsigned int 無符號整型 )
char arr[] = "abcdef"; //錯誤示范 int sz1 = strlen(arr); //正確示范 size_t sz = strlen(arr);
注意點2
注意函數(shù)的返回值為size_t,是無符號的( 易錯 )
//3 - 8 < 0? //strlen函數(shù)是size_t類型,是無符號的,必定大于0?。?! int main() { if (strlen("abc") - strlen("abcdefgh") > 0) { printf("哈哈哈~~"); } else printf("吼吼吼!"); return 0; } //運行結(jié)果是 哈哈哈~~
對比代碼:
int main() { if ((int)strlen("abc") - (int)strlen("abcdefgh") > 0) { printf("哈哈哈~~"); } else printf("吼吼吼!"); return 0; } //運行結(jié)果是 吼吼吼!
2.strcpy
char* strcpy(char * destination, const char * source );
- 源字符串必須以 '\0' 結(jié)束。
- 會將源字符串中的 '\0' 拷貝到目標空間。
- 目標空間必須足夠大,以確保能存放源字符串。
- 目標空間必須可變。( 即:不能是不可修改的常量字符串 )
- 學會模擬實現(xiàn)。
講解:
注意點1:
我們發(fā)現(xiàn),copy時,將源字符串毫無保留的( 包括末尾的 '\0' )一塊copy到目標字符串中??!
注意點2:
如果源字符串中間本身就含有'\0',那么我們同樣還是取到遇見的第一個‘\0' ,不會繼續(xù)往后打印的?。?!
注意點3:
目標空間必須足夠大,以確保能存放源字符串。
//錯誤示范 //目標字符串空間太少 char arr1[] = "xxx"; char arr2[] = "hello\0abc"; strcpy(arr1, arr2);
注意點4:
目標空間必須可變。
模擬strcpy函數(shù)
代碼1:
#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:(升級版~~)
#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; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++利用隨機策略實現(xiàn)優(yōu)化二叉樹操作效率
這篇文章中我們主要來詳細探討隨機化二叉搜索樹的基本思想、實現(xiàn)方法,以及如何在C++中應用這些策略來優(yōu)化我們的數(shù)據(jù)結(jié)構(gòu),感興趣的可以了解下2024-02-02C語言中的sizeof操作符用法及和strlen的區(qū)別
這篇文章主要介紹了C語言中的sizeof操作符用法及和strlen的區(qū)別,本文講解了sizeof的定義、sizeof的語法以及使用實例,最后給出sizeof與strlen的區(qū)別,需要的朋友可以參考下2015-07-07C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式代碼示例
數(shù)組元素和數(shù)組名都可以作為函數(shù)的參數(shù)以實現(xiàn)函數(shù)間數(shù)據(jù)的傳遞和共享,下面這篇文章主要給大家介紹了關(guān)于C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-06-06