C語(yǔ)言超詳細(xì)講解字符串函數(shù)和內(nèi)存函數(shù)
字符串函數(shù)
長(zhǎng)度不受限制的字符串函數(shù)
strlen
size_t strlen ( const char * str )
求字符串長(zhǎng)度:
字符串以'\0' 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 '\0' 前面出現(xiàn)的字符個(gè)數(shù)(不包含 '\0' )
參數(shù)指向的字符串必須要以 '\0' 結(jié)束
注意函數(shù)的返回值為size_t,是無(wú)符號(hào)的
例子如下:計(jì)算Hello World! 的字符數(shù)
strcpy
char* strcpy(char * destination, const char * source )
用法:將 source 指向的 C 字符串復(fù)制到 destination 指向的數(shù)組中,包括終止空字符(并在該點(diǎn)停止)
注意:
源字符串必須以 '\0' 結(jié)束。
會(huì)將源字符串中的 '\0' 拷貝到目標(biāo)空間。
目標(biāo)空間必須足夠大,以確保能存放源字符串。
目標(biāo)空間必須可變
strcpy的實(shí)現(xiàn):
char * strcpy(char *dest, const char*src) { char *ret = dest;//記錄下字符串dest的起始地址 assert(dest != NULL); assert(src != NULL); while((*dest++ = *src++))//copy { ; } return ret;//返回起始地址 }
strcat
char * strcat ( char * destination, const char * source )
用法:將源字符串的副本附加到目標(biāo)字符串。也就是將src字符串接在dest的字符串后面,并且src字符串的第一個(gè)字符覆蓋dest的最后一個(gè)字符(\0),并且在接好的字符串后加上'\0'
注意:
源字符串必須以 '\0' 結(jié)束。
目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容。
目標(biāo)空間必須可修改。
strcat的實(shí)現(xiàn):
char * strcat(char *dest, const char*src) { char *ret = dest; assert(dest != NULL); assert(src != NULL); //找到目標(biāo)空間 while(*dest) { dest++; } //拷貝 while((*dest++ = *src++)) { ; } return ret; }
strcmp
int strcmp ( const char * str1, const char * str2 )
用法:此函數(shù)開(kāi)始比較每個(gè)字符串的第一個(gè)字符。如果它們等于每個(gè)其他,它會(huì)繼續(xù)以下對(duì),直到字符不同或終止達(dá)到空字符。
注意:
第一個(gè)字符串大于第二個(gè)字符串,則返回大于0的數(shù)字
第一個(gè)字符串等于第二個(gè)字符串,則返回0
第一個(gè)字符串小于第二個(gè)字符串,則返回小于0的數(shù)字
strcmp的實(shí)現(xiàn):
?int strcmp(const char* st1, const char* st2) { int ret = 0; while (*st1 == *st2) { st1++; st2++; if(*st1 == *st2 && *st1 == '\0') return ret;//相等的時(shí)候返回0 } return *st1 - *st2;
長(zhǎng)度受限制的字符串函數(shù)介紹
strncpy
拷貝num個(gè)字符從源字符串到目標(biāo)空間。
如果源字符串的長(zhǎng)度小于num,則拷貝完源字符串之后,在目標(biāo)的后邊追加0,直到num個(gè)。
strncat
將源的前 num 個(gè)字符附加到目標(biāo),加上一個(gè)終止空字符。
如果 source 中 C 字符串的長(zhǎng)度小于 num,則只有到終止符的內(nèi)容空字符被復(fù)制
strncmp
比較到出現(xiàn)另個(gè)字符不一樣或者一個(gè)字符串結(jié)束或者num個(gè)字符全部比較完。
字符串查找以及錯(cuò)誤報(bào)告
strstr
char * strstr ( const char *str1, const char * str2)
返回指向 str1 中第一次出現(xiàn) str2 的指針,如果 str2 不屬于字符串str1就返回空指針
strstr的實(shí)現(xiàn):
char* strstr(const char* st1, const char* st2) { //st1,st2標(biāo)注起始位置 char* s1 = st1; char* s2 = st2; char* cur = s1; while (*cur) { s1 = cur; while (*s1 == *s2 && *s1 && *s2) { s1++; s2++; } if (*s2 == '\0') { return cur; } cur++; } return NULL;//找不到 }
strtok
用法:根據(jù)給出的字符將字符串分隔開(kāi)
char * strtok ( char * str, const char * sep )
sep參數(shù)是個(gè)字符串,定義了用作分隔符的字符集合
第一個(gè)參數(shù)指定一個(gè)字符串,它包含了0個(gè)或者多個(gè)由sep字符串中一個(gè)或者多個(gè)分隔符分割的標(biāo)
記strtok函數(shù)找到str中的下一個(gè)標(biāo)記,并將其用 \0 結(jié)尾,返回一個(gè)指向這個(gè)標(biāo)記的指針。(注:
strtok函數(shù)會(huì)改變被操作的字符串,所以在使用strtok函數(shù)切分的字符串一般都是臨時(shí)拷貝的內(nèi)容
并且可修改。)
strtok函數(shù)的第一個(gè)參數(shù)不為 NULL ,函數(shù)將找到str中第一個(gè)標(biāo)記,strtok函數(shù)將保存它在字符串
中的位置。
strtok函數(shù)的第一個(gè)參數(shù)為 NULL ,函數(shù)將在同一個(gè)字符串中被保存的位置開(kāi)始,查找下一個(gè)標(biāo)
記。
如果字符串中不存在更多的標(biāo)記,則返回 NULL 指針
這里演示一下:
strerror
char * strerror ( int errnum )
返回錯(cuò)誤碼,所對(duì)應(yīng)的錯(cuò)誤信息
這里頭文件為#include<errno.h>
演示如下;
內(nèi)存操作函數(shù)
memcpy
void * memcpy ( void * destination, const void * source, size_t num )
用法:函數(shù)memcpy從source的位置開(kāi)始向后復(fù)制num個(gè)字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。
這個(gè)函數(shù)在遇到 '\0' 的時(shí)候并不會(huì)停下來(lái)。
如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。
memcpy的實(shí)現(xiàn):
?void* memcpy(void* dest, const void* src, size_t sz) { assert(dest && src); void* ret = dest; int count = sz; while (count--) { *(char*)dest = *(char*)src;//拷貝 dest = (char*)dest + 1; src = (char*)src + 1; } return ret; }
memmove
void * memmove ( void * destination, const void * source, size_t num )
用法:和memcpy的用法差不多,和memcpy的差別就是memmove函數(shù)處理的源內(nèi)存塊和目標(biāo)內(nèi)存塊是可以重疊的。
如果源空間和目標(biāo)空間出現(xiàn)重疊,就得使用memmove函數(shù)處理
memmove的實(shí)現(xiàn):
void* memmove(void* dest, const void* src, size_t sz) { assert(dest && src);//斷言 int* ret = dest; int count = sz; if (*(char*)dest > *(char*)src && *(char*)dest < *(char*)src + count) { //后->前 while (count--) { *((char*)dest + count) = *(char*)src + count; } } else { //前->后 while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } return ret; }
memcmp
int memcmp ( const void * ptr1,const void * ptr2,size_t num )
用法:比較從ptr1和ptr2指針開(kāi)始的num個(gè)字節(jié)
返回值:
到此這篇關(guān)于C語(yǔ)言超詳細(xì)講解字符串函數(shù)和內(nèi)存函數(shù)的文章就介紹到這了,更多相關(guān)C語(yǔ)言字符串函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解
- c語(yǔ)言重要的字符串與內(nèi)存函數(shù)
- C語(yǔ)言?xún)?nèi)存函數(shù)的使用及其模擬實(shí)現(xiàn)
- C語(yǔ)言詳解如何應(yīng)用模擬字符串和內(nèi)存函數(shù)
- C語(yǔ)言深入詳解四大內(nèi)存函數(shù)的使用
- C語(yǔ)言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)
- 深入了解C語(yǔ)言中的字符串和內(nèi)存函數(shù)
- 深度解析三個(gè)常見(jiàn)的C語(yǔ)言?xún)?nèi)存函數(shù)
- C語(yǔ)言?xún)?nèi)存函數(shù)的實(shí)現(xiàn)示例
- C語(yǔ)言?xún)?nèi)存函數(shù)的具體使用
- C語(yǔ)言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼
相關(guān)文章
C/C++讀寫(xiě)文本文件、二進(jìn)制文件的方法
今天小編就為大家分享一篇C/C++讀寫(xiě)文本文件、二進(jìn)制文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07OpenCV中C++函數(shù)imread讀取圖片的問(wèn)題及解決方法
利用C++函數(shù)imread讀取圖片的時(shí)候返回的結(jié)果總是空,而利用C函數(shù)cvLoadImage時(shí)卻能讀取到圖像。怎么回事?今天小編通過(guò)本教程給大家簡(jiǎn)單說(shuō)明原因2017-03-03QTimer與QTime實(shí)現(xiàn)電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了QTimer與QTime實(shí)現(xiàn)電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07Linux C 獲取進(jìn)程退出值的實(shí)現(xiàn)代碼
本篇文章是對(duì)在Linux下使用c語(yǔ)言獲取進(jìn)程退出值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++ deque與vector對(duì)比的優(yōu)缺點(diǎn)
這篇文章主要介紹了C++中deque與vector相比的優(yōu)勢(shì)與劣勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01CMake語(yǔ)法及CMakeList.txt簡(jiǎn)單使用小結(jié)
Cmake主要用于開(kāi)發(fā)跨平臺(tái)的C++項(xiàng)目,本文主要介紹了CMake語(yǔ)法及CMakeList.txt簡(jiǎn)單使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2022-05-05