1:源字符串必须以 '\0’结束
2:原字符串的 ‘\0’ 会拷贝到目标空间
3:目标空间必须够大才行
4:目标空间必须可变
#include <stdio.h>
#include <assert.h>
#include <string.h>
void myStrcopy(char * source , const char * target) {
assert(source != NULL);
assert(target != NULL);
assert(strlen(source) >= strlen(target));
while ((*source++=*target++) != '\0');
}
int main() {
char arr1[] = "abcdefgsdsds";
char arr2[] = "1234567890";
myStrcopy(arr1, arr2);
printf("%s \n", arr1);
return 0;
}
缺陷:
- 没有考虑返回值的问题
#include <stdio.h>
#include <assert.h>
#include <string.h>
char* myStrcopy(char * source , const char * target) {
assert(source != NULL);
assert(target != NULL);
assert(strlen(source) >= strlen(target));
char* dest = source;
while ((*source++=*target++) != '\0');
return dest;
}
int main() {
char arr1[] = "abcdefgsdsds";
char arr2[] = "1234567890";
char* dest = myStrcopy(arr1, arr2);
printf("%s \n", dest);
return 0;
}
缺陷:
- 没有考虑内存重叠的问题
其实是有 BUG 的:
#include <stdio.h>
#include <assert.h>
#include <string.h>
char* myStrcopy(char * source , const char * target) {
assert(source != NULL);
assert(target != NULL);
assert(strlen(source) >= strlen(target));
char* dest = source;
while ((*source++=*target++) != '\0');
return dest;
}
int main() {
//这样定义的字符串不包含 '\0',然后就炸了,再然后就没有然后了。
char arr1[] = "abcdefgsdsds";
char arr2[] = { '1','2','3' };
char* failed = myStrcopy(arr1, arr2);
printf("%s \n", failed);
return 0;
}