一、strcpy的使用和模拟实现
(一)strcpy使用
//strcpy的使用
#include <stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[10] = "qwertt";
char arr3[10] = "okl";
strcpy(arr2, arr1);
printf("arr2 = %s\n", arr2);
strcpy(arr2, arr3);
printf("arr1 = %s\narr2 = %s\narr3 = %s", arr1,arr2,arr3);
return 0;
}
(二)strcpy使用的注意事项
• 注意strcpy需要包含的头文件是 <string.h>
• 源字符串必须以 '\0' 结束,会将源字符串中的 '\0' 拷贝到目标空间。
• 目标空间必须足够大,以确保能存放源字符串。
• 目标空间必须可修改。
•strcpy函数返回的是目标空间的起始地址
如下例,字符中的'\0'也会同样被赋值进目标空间。
#include <stdio.h>
int main()
{
char arr1[] = "xxxxxxxxxx";
char arr2[] = "abc";
strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
当源字符串空间大于目标空间时,使用strcpy函数会有怎样的结果?
系统会报错。
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "xxxxxxxxxx";
char arr2[] = "abc";
strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
(三)strcpy的模拟实现
strcpy函数返回的是目标空间的起始地址
strcpy函数的返回类型的设置是为了实现链式访问
#include <stdio.h>
#include <string.h>
#include <assert.h>
char *my_strcpy(char* str1, const char* str2)
{
assert(str1 && str2);
while (*str2)
{
*str1 = *str2;
++str1;
++str2;
if (*str2 == '\0')
*str1 = *str2;
}
return str1;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "qwert";
my_strcpy(arr1,arr2);
printf("%s", arr1);
return 0;
}
进行优化
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1++ = *str2++)
{
;
}
return str1;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "qwert";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
二、strcat的使用和模拟实现
(一)strcat使用
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "poiuy";
strcat(arr1, arr2);
printf("arr1=%s\narr2=%s", arr1, arr2);
return 0;
}
(二)strcat使用的注意事项
- 注意strcpy需要包含的头文件是 <string.h>
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
(三)strcat的模拟实现
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest)//找目标字符串中的'\0'
{
dest++;
}
while (*dest++ = *src++)//附加字符串
{
;
}
return ret;
}
int main()
{
char arr1[20] = "asdfg";
char arr2[] = "mnbvc";
my_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
(四)字符串自身附加
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest)//找目标字符串中的'\0'
{
dest++;
}
while (*dest++ = *src++)//附加字符串
{
;
}
return ret;
}
int main()
{
char arr[20] = "asdfg";
my_strcat(arr, arr);
printf("%s", arr);
return 0;
}
存在错误,自身附加自身的字符串时,字符串的'\0'很容易被覆盖。
三、strcmp的使用和模拟实现
(一)strcmp使用
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "asdfgh";
char arr2[] = "ascfgh";
char arr3[] = "asdfghj";
char arr4[] = "asdfghj";
int ret1 = strcmp(arr2, arr1);
int ret2 = strcmp(arr3, arr1);
int ret3 = strcmp(arr2, arr3);
int ret4 = strcmp(arr4, arr3);
printf("%d %d %d %d", ret1, ret2, ret3,ret4);
return 0;
}
(二)strcmp使用的注意事项
- 此函数开始比较每个字符串的第一个字符。如果它们彼此相等则继续比较后续的字符相应,直到字符不同或终止达到null字符。
- 标准规定:
-
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
(三)strcmp的模拟实现
#include <stdio.h>
#include <assert.h>
int* my_strcmp(char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2)
{
if(*s1 == '\0')
return 0;
s1++;
s2++;
}
if (*s1 > *s2)
return 1;
else
return -1;
}
int main()
{
char arr1[] = "asdfgh";
char arr2[] = "asdfg";
int ret = my_strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}