1. memcpy函數原型:
void* memcpy(void* dst, const void* src, size_t size);
void* memmove(void* dst, const void* src, size_t size);
?分析:
- source和destin所指的內存區域可能重疊,但是如果source和destin所指的內存區域重疊,那么這個函數并不能夠確保source所在重疊區域在拷貝之前不被覆蓋。而使用memmove可以用來處理重疊區域。函數返回指向destin的指針.
- 如果目標數組destin本身已有數據,執行memcpy()后,將覆蓋原有數據(最多覆蓋n)。如果要追加數據,則每次執行memcpy后,要將目標數組地址增加到你要追加數據的地址。
- 注意:source和destin都不一定是數組,任意的可讀寫的空間均可。
函數實現:?
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函數原型:
char *strcpy(char *dest, const char *src);
分析:?
- dest:指向用于存儲復制內容的目標數組。
- src:要復制的字符串。
- 返回值:該函數返回一個指向最終的目標字符串 dest 的指針。
函數實現:?
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函數
char* strcat(char* dst, const char* src)
{char* ret = dst;while(*dst != '\0')++dst;while((*dst++ = *src) != '\0');return ret;
}
?
4.?strcmp函數原型:
int strcmp(const char *s1, const char *s2);?
返回值:?
- 若s1、s2字符串相等,則返回零;
- 若s1大于s2,則返回大于零的數;否則,則返回小于零的數。
- 說明:strcmp()函數是根據ACSII碼的值來比較兩個字符串的;strcmp()函數首先將s1字符串的第一個字符值減去s2第一個字符,若差值為零則繼續比較下去;若差值不為零,則返回差值。?
函數實現:?
int strcmp(const char* str1, const char* str2)
{while(*str1 == *str2 && *str1 != '\0'){++str1;++str2;}return *str1 - *str2;
}
?
5.? 如何判斷兩個結構體是否相等?
- 判斷兩個結構體是否相等:重載操作符"=="
- 不能用函數memcmp來判斷兩個結構體是否相等:memcmp函數是逐個字節進行比較的,而struct存在字節對齊,字節對齊時補的字節內容是隨機的,會產生垃圾值,所以無法比較。
int memcmp(const void *buf1, const void *buf2, unsigned int count);
分析:比較內存區域buf1和buf2的前count個字節。
返回值:
- 當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.?