日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++ Primer | 0 】字符串函数实现

發(fā)布時間:2023/11/30 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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)生垃圾值,所以無法比較。
int memcmp(const void *buf1, const void *buf2, unsigned int count);

分析:比較內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。