strcpy和strcnpy函数详解

本文详细介绍了C语言中的strcpy和strncpy函数,包括它们的用途、注意事项(如处理空指针和防止缓冲区溢出),以及各自的函数实现。重点强调了strncpy的可控制字符复制数量特性。

1.了解strcpy和strcpy

由图可知,返回值是char*

头文件为#include <string.h>

注意:strcpy只用于字符串复制,遇到‘\0’时停止,还会复制字符串的结束符'\0'; 所以源字符串必须以’\0’结束,也会将源字符串的’\0’拷贝到目标空间

2.strcpy和strncpy函数用法

strcpy函数就是把一个字符串复制粘贴到另一个字符串上,也就是把const char * source复制粘贴到char * destination,因为char*source不需要改变,所以可以加一个const修饰。第二张图片我们可以看到strncpy函数比strcpy多了一个size_t num,这是你想要复制的字符数。

3.strcpy和strncpy使用

这是运用strcpy函数把arr2中的字符串拷贝到arr1中的运用。

注意!!!:在使用strcpy函数时,char * destination必须足够大,否则可能会造成缓冲溢出的错误情况。

当出现这种情况时,我们可以考虑用strcnpy函数

这样我们就可以控制我们需要复制的字符串到arr1上面了。 

4.strcpy和strncpy函数实现

strcpy函数实现:

char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL && src != NULL);
	char* ret = dest;
	while (*dest++ = *src++)//对dest和src两个字符串的第一个字母开始逐个复制粘贴,直到遇到'\0'
	{
		;
	}
	*dest = *src;
	return ret;
}

int main()
{
	char arr1[] = "hellooo";
	char arr2[] = "world";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

在传参过程中,为了避免传空指针,所以用assert来避免一下。

strncpy函数实现:

char* my_strncpy(char* dest, const char* src,int n)
{
	assert(dest != NULL && src != NULL);
	char* ret = dest;//保留dest的起始地址,strncpy需要返回字符串的起始地址
	while (n)
	{
		*dest = *src;
		*dest++;
		*src++;
		n--;
	}
	return ret;
}


int main()
{
	char arr1[] = "hello";
	char arr2[] = "ppp";
	my_strncpy(arr1, arr2,3);
	printf("%s", arr1);

	return 0;
}

注意!!!:这两个函数的实现,都需要返回这个字符串的起始地址 。

对于复制的字符串来说就不需要改变,所以可以加const来修饰。

<< `strcpy` `strcmp` 是 C 标准库中的两个非常常用的字符串处理函数。 ### strcpy 函数 **定义与原型** ```c char *strcpy(char *dest, const char *src); ``` - **参数说明**: - `dest`: 目标字符数组(目标缓冲区),该空间必须足够大以容纳来自源 (`src`) 的所有字符,包括终止空字符 `\0`。 - `src`: 源字符串指针,即要复制的内容。 - **返回值**: 返回指向 `dest` 的指针。 - **功能描述**: 将 src 所指向的字符串拷贝到 dest 中,并且会将末尾的 '\0' 字符也一起复制过去。如果目的地址的空间不够,则可能会造成内存溢出等问题。 #### 使用示例 ```c #include <stdio.h> #include <string.h> int main(){ char source[50] = "Hello"; char destination[50]; // Copy string from source to destination. strcpy(destination, source); printf("Copied String: %s\n", destination); } ``` ### strcmp 函数 **定义与原型** ```c int strcmp(const char *str1, const char *str2); ``` - **参数说明**: - `str1`, `str2`: 需要比对的两串字节序列或 ASCII 编码表示的文字内容. - **返回值**: 如果 str1 str2 完全相同则返回零; 若第一个不匹配处前者的小于后者就返回一个小于 0 的数;否则为大于 0 的整数值 - **注意事项**: 进行的是逐个比较对应位置上的ASCII码大小关系直到遇到'\0',所以对于非打印字符如控制符号等也需要谨慎对待! #### 示例用法 ```c #include <stdio.h> #include <string.h> int main() { int ret; /* Comparing two strings */ ret = strcmp("abc", "def"); if(ret > 0) puts("\"abc\" is greater than \"def\""); else if (ret == 0) puts("\"abc\" equals \"def\""); else puts("\"abc\" is less than \"def\""); return(0); } ``` 使用这两个函数时需要注意以下几点: 1. 在调用 `strcpy()` 前确保有足够的空间存储被复制过来的数据避免越界写入导致程序崩溃或者安全漏洞。 2. 对比结果仅适用于区分大小写字母、数字其他可显示字符间的排序逻辑; 不建议直接用于其他编码集比如 Unicode 或者多字节字符环境里头判断相等情况因为它们内部可能还包含有更多额外的信息字段影响最终判定结论正确性。 3. 当涉及到用户输入或者其他不确定来源的数据时候应当考虑先做必要的清理工作例如去除前后空白再进行后续操作防止意外情况发生.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值