strcpy( )
先从名字来看,str就是string,cpy就是copy,字符串复制、拷贝,接下来说一下它怎么使用。
先来看这样一串代码:
看这段代码我们能知道它是想要给初始化的数组赋值,但是编译器有报错,很显然这样不行,arr是数组首元素地址,是个地址常量,无法用来存放字符串,我们需要把字符串拷贝,放到数组里,这时就需要请出这个strcpy。
通过查看文档,能够知道strcpy是个函数,函数参数第一个是char *,而且存放目标空间地址,第二个是const char *,存放原空间地址,是把原空间地址内容拷贝到目标空间内,这就是这个函数基本原理。
所以:
char arr[20] = {0};
strcpy(arr , "hello");
printf("%s\n",arr);
这样就使用了strcpy函数,看到这,可能我们会有一个疑问,如果以下面这种方式,strcpy能否进行拷贝,它是否和strlen函数同样需要'\0'来判断
char arr[20] = {0};
char arr2[] = {'a','b','c','d'};
strcpy(arr,arr2);
验证strcpy是否需要'\0'判断,可以通过调试查看
char arr[20] = {***********};
strcpy(arr,"hello");
能够看到strcpy把字符串末尾的'\0'也拷贝到数组中了,同时'\0'也是strcpy函数的停止条件,在这里如果我们尝试将上面代码中arr2的内容拷贝到arr中,程序会出错挂掉,因为并不清楚'a','b','c','d'后面什么时候遇到'\0',这时候已经越界访问很久了
再如果:
char arr[5] = "*****";
char *p = "hello world";
strcpy(arr , p);
printf("%s\n",arr);
这样行不行呢,拷贝比目标空间大的字符串,运行看一下
"hello world"字符串长度虽然大于目标空间,但strcpy并不会关注这样的问题,它只会执行拷贝,拷贝确实成功了,但程序出错,所以我们在使用strcpy函数的时候要注意这些问题,字符串包含'\0'、目标空间足够大, 并且还要有目标空间要可修改。
我们把p指针指向的内容放到arr中,arr是数组,是可以修改的,所以它会强行修改,但我们如果这样:
char *str = "zzzzzzzzzzzzzzz";
char *p = "hello world";
strcpy(str,p);
程序会崩掉,因为str指向常量字符串,是不可修改的,强行运行会出错。
这是strcpy的模拟实现:
//模拟实现strcpy
char * my_strcpy(char* dest,const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[20] = { 0 };
char* p = "hello world";
my_strcpy(arr, p);
printf("%s\n", arr);
return 0;
}
了解完strcpy函数,还有一个函数;
strcat( )
int main()
{
char arr[20] = "hello ";//world
return 0;
}
这样一串函数,当我们想要在hello 后面再加上一串字符world,这时候应该怎么办呢?
可以使用strcat函数,这个函数是字符串追加,或者叫字符串连接,这样说可能还不够明白,再看一下这个函数的文档:
依旧是把原空间的内容追加到目标空间后面去,
int main()
{
char arr[20] = "hello ";
char arr2[] = "world";
strcat(arr,arr2);
printf("%s\n",arr);
return 0;
}
由此可见,strcat函数作用是在目标有足够空间基础上,把原空间内容追加过去,那么这个时候会有一个疑问,从哪里开始?追加什么时候会停下来?'\0'是否也会追加过去?可以修改代码测试一下:
int main()
{
char arr[20] = "hello \0*********";
char arr2[] = "world";
strcat(arr,arr2);
printf("%s\n",arr);
return 0;
}
追加前:
追加后:
可以看到arr2中的'\0'也被追加,说明要追加的内容中也必须有'\0',到这,我们能够知道的使用strcat需要注意的点有:目标空间必须足够大,能够容纳追加字符串的内容;目标空间必须可修改;追加内容中必须有'\0'。
可能我们在学习过程中又会有一个问题出现,arr追加自己能否成功?
可以再来测试一下:
int main()
{
char arr[] = "abcd";
strcat(arr,arr);//?
printf("%s\n",arr);
return 0;
}
当我们程序启动,会发现
打印出了一大串字符最后程序还出错了,这是为什么呢?我们来分析一下:
这是我们的arr数组,当我们使用strcat追加arr自身的时候,是这样一个过程:
我们会发现,四个字符全部追加完,该结尾追加'\0'时,原本的'\0已经被字符'a'追加覆盖了,找不到'\0',便会一直向后访问寻找,最后程序出错,所以strcar函数是不能用目标空间内容追加自身的。
这是strcat的模拟实现:
//模拟实现strcat
char * my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[20] = "hello ";
char arr2[] = "world";
printf("%s", my_strcat(arr, arr2));
return 0;
}