strcpy 的应用和模拟实现
strcpy详解:
先来看下官网对strcmp的介绍。
绿色部分括号内为需要的两个参数.
第一个 char * destination 指的是目标字符串的起始地址;
第二个 conset char * source 指的是要拷贝的字符串;
最前面的 char * strcpy 表明返回类型为 字符指针.(返回目标空间destination的起始地址)
注意:用这个库函数时要引用头文件<string.h>
实例代码
int main()
{
char dest[] = { "elon" };
char src[] = { "musk" };
strcpy(dest, src);
//打印复制后的dest内容
printf("%s\n", dest);
return 0;
}
在这里大家可以看到 src 里的内容已经成功复制到了 dest 里面
细节注意:
- 因为函数在拷贝字符串src时是到 \0 是才能停止。所以在将拷贝的内容放到dest是要确保dest里面有足够的空间(至少可以包含 \0 ),否则在后续使用 如打印dest时会因没有 \0 而报错。
模拟实现:
char* my_strcpy(char* dest[], const char* src[])
{
//保存目标函数的初始地址
char* ret = dest;
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
//最后将 \0 也copy过去
*dest = *src;
return ret;
}
int main()
{
char dest[] = { "elon" };
char srce[] = { "musk" };
my_strcpy(dest, srce);
//打印复制后的dest内容
printf("%s\n", dest);
return 0;
}
函数内部while循环我们可以再优化一下:
char* my_strcpy(char* dest[], const char* src[])
{
//保存目标函数的初始地址
char* ret = dest;
while (*dest++ = *src++)
;
return ret;
}
int main()
{
char dest[] = { "elon" };
char srce[] = { "musk" };
char * ret = my_strcpy(dest, srce);
//用my_strcpy的返回值打印复制后的内容
printf("%s\n", ret);
return 0;
}
这里我们也可以用my_strcpy的返回值打印复制后的内容。
strcat 的应用和模拟实现
strcat详解:
先来看下官网对strcat的介绍。
绿色部分括号内为需要的两个参数.
第一个 char * destination 指的是被链接字符串的起始地址;
第二个 conset char * source 指的是要连接的字符串的起始地址;
最前面的 char * strcat 表明返回类型为 字符指针.(返回目标空间destination的起始地址)
注意:用这个库函数时要引用头文件<string.h>
实例代码
int main()
{
char dest[20] = { "elon " };
char src[] = { "musk" };
char * ret = strcat(dest, src);
//打印连接后的dest内容
printf("%s\n", ret);
return 0;
}
在这里大家可以看到 src 里的内容已经成功连接到了 dest 后面
细节注意:
- 目标空间同样要保留足够的空间,防止溢出
模拟实现:
char* my_strcat(char* dest, const char* src)
{
//保存目标函数的初始地址
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
;
return ret;
}
int main()
{
char dest[20] = { "elon " };
char src[] = { "musk" };
char * ret = my_strcat(dest, src);
//打印连接后的dest内容
printf("%s\n", ret);
return 0;
}
strcmp 的应用和模拟实现
strcmp详解:
先来看下官网对strcmp的介绍。
对返回值的介绍:
翻译后:
- 绿色部分括号内为需要的两个参数.是要对比的两字符串的起始地址。
- 两字符串的对比方法是逐位对比对应字符的ASCII码(\0 的ASCII值最小为 0)
- 在逐位对比中最先出现的 ASCII小的那个字符所在字符串 即小于另一个字符串。
eg: “abcdef” < “abd” 返回一个小于零的数 - 最前面的 int 表明返回类型为 整形。
注意:用这个库函数时要引用头文件<string.h>
实例代码
int main()
{
char str1[] = { "abc" };
char str2[] = { "abd" };
int ret = strcmp(str1, str2);
//打印判断结果
if (ret < 0)
{
printf("str1 < str2");
}
else if (ret > 0)
{
printf("str1 > str2");
}
else
{
printf("str1 = str2");
}
return 0;
}
运行结果
模拟实现:
int my_strcmp(char* str1, char* str2)
{
//断言下两个指针非空
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 = '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char str1[] = { "abc" };
char str2[] = { "abd" };
int ret = my_strcmp(str1, str2);
//打印判断结果
if (ret < 0)
{
printf("str1 < str2");
}
else if (ret > 0)
{
printf("str1 > str2");
}
else
{
printf("str1 = str2");
}
return 0;
}
今天内容到此结束,欢迎大家三连。
标签:src,dest,str2,str1,strcat,ret,char,strcpy,strcmp From: https://blog.csdn.net/Pioneer_ing/article/details/143694593