//
// main.cpp
// C++Test13
//
//
#include <iostream>
using namespace std;
// strcpy函数实现
char *mystrcpy(char *des, const char *src) {
// assert(*des != NULL && *src != NULL);
if (NULL == des || NULL == src)
return NULL;
char *ret = des;
while ((*des++ = *src++) != '\0')
;
return ret;
}
// strcmp函数实现
int mystrcmp(const char *str1, const char *str2) {
if (NULL == str1 || NULL == str2)
return NULL;
while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2) {
str1++;
str2++;
}
return *str1 - *str2;
}
// strlen函数实现
size_t mystrlen(const char *str) {
size_t len = 0;
if (NULL == str)
return NULL;
while (*str++ != '\0') {
len++;
}
return len;
}
// strcat函数实现
char * mystrcat(char * dst,const char * src){
if (NULL == dst || NULL == src)
return NULL;
char * temp = dst;
while (* temp!= '\0') temp++; //如果temp指针没有遇见'\0' temp++
while ((* temp++ = * src++) != '\0');//实现循环拷贝,当src为'\0'时结束
return dst;
}
// mymemcpy函数实现
void *mymemcpy(void *dst, const void *src, size_t len) {
if (NULL == dst || NULL == src)
return NULL;
char *_dst = (char *)dst;
const char *_src = (const char *)src;
while (len--) {
*_dst++ = *_src++;
}
return dst;
}
// mymemmove函数实现(实现了内存重叠和非重叠的拷贝)
void *mymemmove(void *dst, const void *src, size_t len) {
if (NULL == dst || NULL == src)
return NULL;
char *_dst = (char *)dst;
const char *_src = (const char *)src;
if (dst <= src ||
_dst >= _src + len) { //源地址和目的地址不重叠,低字节向高字节拷贝
while (len--) {
*_dst++ = *_src++;
}
} else { // 源地址和目的地址重叠,高字节向低字节拷贝
_dst = (char *)dst + len - 1;
_src = (const char *)src + len - 1;
while (len--) {
*_dst-- = *_src--;
}
}
return dst;
}
// memset函数实现
// 参数:s为内存区域的起始位置,c为要填充的字符,n为要填充多少个字节
void * mymemset(void *s, int c, size_t n) {
if (NULL == s || n < 0) return NULL;
char * tmp = (char *)s;
while (n-- > 0) *tmp++ = c;
return s;
}
int main(int argc, const char *argv[]) {
char str1[] = "12345";
char str2[10];
cout << "str1:" << str1 << endl;
cout << "mystrcpy(str2,str1):" << mystrcpy(str2, str1) << endl;
char stra[] = "12345";
char strb[] = "123";
cout << "stra:" << stra << endl;
cout << "strb:" << strb << endl;
cout << "mystrcmp(stra,strb):" << mystrcmp(stra, strb) << endl;
char strc[] = "12345";
cout << "mystrlen(str):" << mystrlen(strc) << endl;
cout << "mystrcat(stra, strb):" << mystrcat(stra, strb) << endl;
char strd[] = "12345";
char stre[10];
cout << "mymemcpy(stre, strd, 3):" << mymemcpy(stre, strd, 3) << endl;
cout << stre << endl;
int a[10];
for (int i = 0; i < 10; i++) {
a[i] = i;
}
cout << "mymemcpy(&a[3],a,7*sizeof(int)):"<< mymemcpy(&a[3], a, 7 * sizeof(int)) << endl;
for(auto item: a) {
cout << item << " ";
}
cout << endl;
for (int i = 0; i < 10; i++) {
a[i] = i;
}
cout << "mymemmove(&a[3],a,7*sizeof(int)):"<< mymemmove(&a[3], a, 7 * sizeof(int)) << endl;
for(auto item: a) {
cout << item << " ";
}
cout << endl;
char buf[10];
cout << "sizeof buf:" << sizeof(buf) << endl;
for (int i = 0; i < 10; i++) {
cout << "buf[" << i << "] = " << buf[i] << endl;
}
cout << endl;
mymemset(buf, 'a', sizeof(buf));
for (int i = 0; i < 10; i++) {
cout << "buf[" << i << "] = " << buf[i] << endl;
}
return 0;
}