自学C语言 - strcpy和strcat

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;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值