#include <stdio.h>
#include <assert.h>
//void my_strcpy(char* des, char* src)
//{
// while (*src!=‘\0‘)
// {
// *des = *src;
// *des++;
// *src++;
// }
// *des = *src;
//} --6分
//void my_strcpy(char* des, char* src)
//{
// while (*src != ‘\0‘)
// {
// *des++ = *src++;
// }
// *des = *src;
//}
//void my_strcpy(char* des, char* src)
//{
// while (*des++ = *src++)
// {
// ;
// }
//} //妙哇 7分 但是没有考虑到输入有误的情况,比如输入一个空指针
//void my_strcpy(char* dest, char* src)
//{
// assert(dest != NULL);//断言
// assert(src != NULL); //断言
// //if (dest != NULL && src != NULL)
// //{
// while (*dest++ = *src++)
// {
// ;
// }
// //}
//} //8分
//void my_strcpy(char* dest, const char* src)
//{
// assert(dest != NULL);//断言
// assert(src != NULL); //断言
// while (*dest++ = *src++)
// {
// ;
// }
//} //9分
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);//断言
assert(src != NULL); //断言
//把src指向的字符串拷贝到dest指向的空间里面去,包含‘\0‘字符
while (*dest++ = *src++)
{
;
}
return ret;
//返回到目的地的起始地址,而且拥有返回值时才能作为其他函数的参数,进行链式访问
} //10分
int main()
{
char arr1[] = "***************";
char arr2[] = "hasaki";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
//很烦的一点,NULL一直显示未定义,查了之后说是需要stdio.h,我也引用了啊,最后发现,这个头文件需要引用在NUL的使用之前
//#include <stdio.h>
//int main()
//{
// const int a = 10;
// int* const p = &a;
// //const放在指针变量*左边时,修饰的是*p,也就是说,不能通过p来改变*p(num)的值
// //const放在指针变量*右边时,修饰的是指针变量p本身,p不能被改变了
// *p = 20;
// int n = 1;
// int* np = &n;
// //p = np;
// printf("%d\n", a);
// return 0;
//}
在程序中熟练使用const和arrest能有效地避免很多问题,健壮代码。
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)
{
int count = 0;
assert (str != NULL); //assert需要名为 <assert.h>的头文件
while (*str != ‘\0‘)
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdefg";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
还有就是头文件的调用,一般说明什么标识符未定义,要么就是函数没有调用头文件,要么就是拼写错误,strlen的模拟实现以前也写过三个,这个应该是所有的里面最优秀的一个,最接近真的strlen函数的一个模拟函数。
原文:https://blog.51cto.com/15078858/2608725