注意:在实现strcpy时,记得断言不为NULL,保存目的string(strDest)的首地址可有可无,在while内的判断条件注意是 = 不是==,判断结束标志位!= ‘\0’,返回值是目的字符串地址。
在实现memstrcpy时,判断是否为NULL,如果返回值为void*时,注意在主函数中先调用函数,再输出,否则输出的中值是未拷贝的值,输出随机值。如果是char*,已经确定函数的返回值类型,以及参数类型,则不需要强转类型以及调用与输出可以放在同一行。
代码1-1,1-2如下:
#include<iostream> #include<cassert> using namespace std; char* strcpy_1(char* strDest,const char* strSrc) { assert((strDest!= NULL) && (strSrc != NULL)); while ((*strDest++ = *strSrc++) != '\0') { } return strDest; } int main() { char* string1 = "string1"; char a[30]; strcpy_1(a, string1); cout <<a<< endl; return 0; } #include<iostream> #include<cassert> using namespace std; char* strcpy_1(char* strDest,const char* strSrc) { assert((strDest!= NULL) && (strSrc != NULL)); char* res = strDest; while ((*strDest++ = *strSrc++) != '\0') { } return res; } int main() { char* string1 = "string1"; char a[30]; cout <<strcpy_1(a, string1)<< endl; return 0; }代码2-1和代码2-2:
#include<iostream> using namespace std; //char* memstrcpy(char* strDest, const char* strSrc,int size) void* memstrcpy(void* strDest, const void* strSrc,int size) { if ((strDest == NULL )|| (strSrc == NULL)) return NULL; char* res = (char*) strDest; char* src = (char*) strSrc; while (size-- > 0) { *res++ = *src++; } return strDest; } int main() { char a[30]; char* string1 = "myteacher2"; int size = 11; memstrcpy(a, string1, size); //memstrcpy(a, "myteacher2", 11);上面三句可这样替换 cout << a << endl; return 0; } #include<iostream> using namespace std; char* memstrcpy(char* strDest, const char* strSrc,int size) { if ((strDest == NULL )|| (strSrc == NULL)) return NULL; while (size-- > 0) { *strDest++ = *strSrc++; } return strDest; } int main() { char a[30]; memstrcpy(a, "myteacher2", 11); cout << a << endl; return 0; }结果图: