内容重点:
重点介绍处理字符和字符串的库函数的使用和注意事项
下面是将要介绍的几个函数:
- 求字符串长度 strlen
- 长度不受限制的字符串函数 strcpy (本节)strcat strcmp
- 长度受限制的字符串函数介绍 strncpy strncat strncmp
- 字符串查找 strstr strtok
- 错误信息报告 strerror
- 字符操作
- 内存操作函数 memcpy memmove memset memcmp
strcpy
char* strcpy(char * destination, const char * source );
译文:
将源指向的C字符串复制到目标指向的数组中,包括终止的null字符(并在该点停止)。
为了避免溢出,目标指向的数组的大小应足够长,以包含与源相同的C字符串(包括终止的null字符),并且在内存中不应与源重叠。
注意:
- 1.会将源字符串中的 '\0' 拷贝到目标空间。
- 2.源字符串必须以 '\0' 结束。
- 3.目标空间必须足够大,以确保能存放源字符串。
- 4.目标空间必须可变。
- 5.学会模拟实现。
0.strcpy的使用示例
#include <stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[20] = { 0 };
strcpy(arr2, arr1);//将arr1的数据拷贝到arr2中
printf("%s\n", arr2);
return 0;
}
结果如下 :
1.会将源字符串中的 '\0' 拷贝到目标空间。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abc\0def";
char arr2[20] = "xxxxxxxx";
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
输出结果为:
拷贝原理:
那么,如果拷贝内容没有包含'\0'呢?那就是下面这种情况
2.源字符串必须以 '\0' 结束。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int main()
{
char arr1[] = { 'a','b','c' };
char arr2[20] = "xxxxxxxx";
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
输出结果:
拷贝原理:
解释:strcpy拷贝到'\0'就停止,但是没有'\0'只能继续拷贝直到找到'\0'。否则输出结果不为正确的拷贝结果。因此要遵守源字符串必须以 '\0' 结束。
3.目标空间必须足够大,以确保能存放源字符串。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[3] = { 0 };
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
//错误示范,目标空间必须足够大
输出结果:
(输出有误且有报错结果)
因此,我们在拷贝的时候需要做到目标空间必须足够大,以确保能存放源字符串
4.目标空间必须可修改。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int main()
{
char* p = "abcdef"; //指针所指向的字符串为常量字符串,其内容不能被修改。
char arr2[20] = "JX_BC";
strcpy(p, arr2);
printf("%s\n", arr2);
return 0;
}
//该程序会崩溃
输出结果:
调试:
用指针指向的字符串来举例,指针指向的内容是不可以改变的。也是错的例子,目标空间必须可以修改才可以实现。
5.学会模拟实现。
需要注意一点的是,这个函数的返回值是目标空间的起始地址。
代码实现:
#include<stdio.h>
#include<assert.h>
//返回的是目标空间的起始地址
char my_strcpy(char* dest, const char* src)//被拷贝的数据不能发生变化,因此加上const不可修改,加上const错位会报错
{
char* ret = dest;//保证目标空间的起始地址不变
assert(dest && src);//断言保证两个指针有效
while (*dest++ = *src++)
{
;
}
return ret;//返回起始地址
}
int main()
{
char str1[] = "hehelala";
char str2[20] = { 0 };
my_strcpy(str2, str1);
printf("%s\n", str2);
//printf("%s\n", my_strcpy(str2, str1));//注意这种情况时,函数返回类型不可以是void,因为这里是直接调用返回值类型,否则不能打印。
return 0;
}
输出结果: