C語言字符函數(shù)與字符串函數(shù)詳解
本章重點(diǎn)
重點(diǎn)介紹處理字符和字符串的庫函數(shù)的使用和注意事項(xiàng)
1.求字符串長度 strlen
2.長度不受限制的字符串函數(shù) strcpy ,strcat, strcmp
3.長度受限制的字符串函數(shù) strncpy,strncat ,strncmp
4.字符串查找 strstr,strtok
5.錯(cuò)誤信息報(bào)告 strerror
6.字符操作
7.內(nèi)存操作函數(shù) memcpy,memmove,memset ,memcmp
前言
C語言中對(duì)字符和字符串的處理很是頻繁,但是C語言本身是沒有字符串類型的,字符串通常放在 常量字符串 中或者 字符數(shù)組 中。 字符串常量 適用于那些對(duì)它不做修改的字符串函數(shù)。
1.strlen函數(shù)
size_t strlen ( const char * str );
- 字符串已經(jīng) '\0' 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 '\0' 前面出現(xiàn)的字符個(gè)數(shù)(不包含 '\0' )。
- 參數(shù)指向的字符串必須要以 '\0' 結(jié)束。
- 注意函數(shù)的返回值為size_t,是無符號(hào)的( 易錯(cuò) )
- 學(xué)會(huì)strlen函數(shù)的模擬實(shí)現(xiàn) (計(jì)數(shù)器、指針-指針、遞歸)
講解:
注意點(diǎn)1
有的編譯器可能用int來接收strlen函數(shù)的返回值會(huì)報(bào)錯(cuò),因?yàn)閟trlen函數(shù)返回值是size_t( unsigned int 無符號(hào)整型 )
char arr[] = "abcdef"; //錯(cuò)誤示范 int sz1 = strlen(arr); //正確示范 size_t sz = strlen(arr);
注意點(diǎn)2
注意函數(shù)的返回值為size_t,是無符號(hào)的( 易錯(cuò) )
//3 - 8 < 0?
//strlen函數(shù)是size_t類型,是無符號(hào)的,必定大于0?。?!
int main()
{
if (strlen("abc") - strlen("abcdefgh") > 0)
{
printf("哈哈哈~~");
}
else
printf("吼吼吼!");
return 0;
}
//運(yùn)行結(jié)果是 哈哈哈~~
對(duì)比代碼:
int main()
{
if ((int)strlen("abc") - (int)strlen("abcdefgh") > 0)
{
printf("哈哈哈~~");
}
else
printf("吼吼吼!");
return 0;
}
//運(yùn)行結(jié)果是 吼吼吼!
2.strcpy
char* strcpy(char * destination, const char * source );

- 源字符串必須以 '\0' 結(jié)束。
- 會(huì)將源字符串中的 '\0' 拷貝到目標(biāo)空間。
- 目標(biāo)空間必須足夠大,以確保能存放源字符串。
- 目標(biāo)空間必須可變。( 即:不能是不可修改的常量字符串 )
- 學(xué)會(huì)模擬實(shí)現(xiàn)。
講解:
注意點(diǎn)1:
我們發(fā)現(xiàn),copy時(shí),將源字符串毫無保留的( 包括末尾的 '\0' )一塊copy到目標(biāo)字符串中!!

注意點(diǎn)2:
如果源字符串中間本身就含有'\0',那么我們同樣還是取到遇見的第一個(gè)‘\0' ,不會(huì)繼續(xù)往后打印的!?。?/p>

注意點(diǎn)3:
目標(biāo)空間必須足夠大,以確保能存放源字符串。
//錯(cuò)誤示范 //目標(biāo)字符串空間太少 char arr1[] = "xxx"; char arr2[] = "hello\0abc"; strcpy(arr1, arr2);
注意點(diǎn)4:
目標(biāo)空間必須可變。

模擬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:(升級(jí)版~~)
#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)文章
VisualStudio?2015?新建C/C++項(xiàng)目的圖文教程
visual?studio是一個(gè)比較集成的開發(fā)平臺(tái),本文主要介紹了VisualStudio?2015?新建C/C++項(xiàng)目的圖文教程,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
Qt5.9實(shí)現(xiàn)簡單的多線程實(shí)例(類QThread)
Qt開啟多線程,主要用到類QThread。用一個(gè)類繼承QThread,然后重新改寫虛函數(shù)run()。具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09
VSCode Linux的C++代碼格式化配置的實(shí)現(xiàn)
動(dòng)格式化代碼容易出現(xiàn)錯(cuò)誤,特別是當(dāng)代碼量較大時(shí),使用自動(dòng)格式化可以減少這種錯(cuò)誤的風(fēng)險(xiǎn),本文主要介紹了VSCode Linux的C++代碼格式化配置的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10
Qt采用線程以隊(duì)列方式實(shí)現(xiàn)下發(fā)數(shù)據(jù)
在C++中隊(duì)列是一種常用的數(shù)據(jù)結(jié)構(gòu)之一,一種特殊的線性表,一般采用先進(jìn)先出的方式。本文主要為大家介紹了Qt如何以隊(duì)列方式實(shí)現(xiàn)下發(fā)數(shù)據(jù),感興趣的可以了解一下2022-10-10
cocos2dx-3.10 C++實(shí)現(xiàn)滾動(dòng)數(shù)字
這篇文章主要為大家詳細(xì)介紹了cocos2dx-3.10 C++實(shí)現(xiàn)滾動(dòng)數(shù)字效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
C++的類型轉(zhuǎn)換(強(qiáng)轉(zhuǎn))你了解嗎
這篇文章主要為大家詳細(xì)介紹了C++的類型轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
如何使用C語言實(shí)現(xiàn)平衡二叉樹數(shù)據(jù)結(jié)構(gòu)算法
對(duì)于判斷是否為平衡二叉樹而言,我們需要知道以下特性:是一個(gè)二叉樹也是一個(gè)二叉排序樹該樹的每個(gè)結(jié)點(diǎn)上的(深度)左子樹 - 右子樹的值為平衡因子(BF(Balance Factor))該樹的每一個(gè)節(jié)點(diǎn)的左子樹和右子樹的高度至多等于1(平衡因子只可能是-1,0,1)2021-08-08

