【C++ Primer | 0 】字符串函数实现
生活随笔
收集整理的這篇文章主要介紹了
【C++ Primer | 0 】字符串函数实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. memcpy函數(shù)原型:
void* memcpy(void* dst, const void* src, size_t size); void* memmove(void* dst, const void* src, size_t size);?分析:
- source和destin所指的內(nèi)存區(qū)域可能重疊,但是如果source和destin所指的內(nèi)存區(qū)域重疊,那么這個函數(shù)并不能夠確保source所在重疊區(qū)域在拷貝之前不被覆蓋。而使用memmove可以用來處理重疊區(qū)域。函數(shù)返回指向destin的指針.
- 如果目標數(shù)組destin本身已有數(shù)據(jù),執(zhí)行memcpy()后,將覆蓋原有數(shù)據(jù)(最多覆蓋n)。如果要追加數(shù)據(jù),則每次執(zhí)行memcpy后,要將目標數(shù)組地址增加到你要追加數(shù)據(jù)的地址。
- 注意:source和destin都不一定是數(shù)組,任意的可讀寫的空間均可。
函數(shù)實現(xiàn):?
void* memcpy(void* dst, const void* src, size_t size) {if(dst == NULL || src == NULL){return NULL;}void* res = dst;char* pdst = (char*)dst;char* psrc = (char*)src;if(pdst > psrc && pdst < psrc + size) //重疊{pdst = pdst + size - 1;psrc = pdst + size - 1;while(size--)*pdst-- = *psrc--;}else //無重疊{while(size--)*dst++ = *src++;}return ret; }?
2. strpcy函數(shù)原型:
char *strcpy(char *dest, const char *src);分析:?
- dest:指向用于存儲復制內(nèi)容的目標數(shù)組。
- src:要復制的字符串。
- 返回值:該函數(shù)返回一個指向最終的目標字符串 dest 的指針。
函數(shù)實現(xiàn):?
char* strcpy(char* dst, const char* src) {assert((dst != NULL) && (src != NULL));char* ret = dst;int size = strlen(src) + 1;if(dst > src || dst < src + len){dst = dst + size - 1;src = src + size - 1;while(size--) *dst-- = *src--;}else{while(size--) *dst++ = *src++;}return ret; }?
3.?手寫strcat函數(shù)
char* strcat(char* dst, const char* src) {char* ret = dst;while(*dst != '\0')++dst;while((*dst++ = *src) != '\0');return ret; }?
4.?strcmp函數(shù)原型:
int strcmp(const char *s1, const char *s2);?返回值:?
- 若s1、s2字符串相等,則返回零;
- 若s1大于s2,則返回大于零的數(shù);否則,則返回小于零的數(shù)。
- 說明:strcmp()函數(shù)是根據(jù)ACSII碼的值來比較兩個字符串的;strcmp()函數(shù)首先將s1字符串的第一個字符值減去s2第一個字符,若差值為零則繼續(xù)比較下去;若差值不為零,則返回差值。?
函數(shù)實現(xiàn):?
int strcmp(const char* str1, const char* str2) {while(*str1 == *str2 && *str1 != '\0'){++str1;++str2;}return *str1 - *str2; }?
5.? 如何判斷兩個結構體是否相等?
- 判斷兩個結構體是否相等:重載操作符"=="
- 不能用函數(shù)memcmp來判斷兩個結構體是否相等:memcmp函數(shù)是逐個字節(jié)進行比較的,而struct存在字節(jié)對齊,字節(jié)對齊時補的字節(jié)內(nèi)容是隨機的,會產(chǎn)生垃圾值,所以無法比較。
分析:比較內(nèi)存區(qū)域buf1和buf2的前count個字節(jié)。
返回值:
- 當buf1<buf2時,返回值小于0
- 當buf1==buf2時,返回值=0
- 當buf1>buf2時,返回值大于0
測試代碼:?
#include<iostream>using namespace std;struct s {int a;int b;bool operator == (const s &rhs); };bool s::operator == (const s &rhs) {return ((a == rhs.a) && (b == rhs.b)); }int main() {struct s s1, s2;s1.a = 1;s1.b = 2;s2.a = 1;s2.b = 2;if (s1 == s2)cout << "兩個結構體相等" << endl;elsecout << "兩個結構體不相等" << endl;return 0; }參考資料:
1.?
總結
以上是生活随笔為你收集整理的【C++ Primer | 0 】字符串函数实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Leetcode | 02】二叉树、线
- 下一篇: 【C++ Priemr | 15】构造函