strcpy函数与strncpy函数

文章详细介绍了C语言中的strcpy和strncpy函数,包括它们的参数、返回值、使用方法及注意事项。strcpy函数用于完全复制一个字符串,但要求目标空间足够大且源字符串必须以结尾。strncpy则允许指定复制的字符数,但可能不会自动添加结束符,因此使用时需额外注意内存安全问题。文章还提供了两个函数的模拟实现以帮助理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

strcpy函数

一. strcpy函数的简介

下面是库中的strcpy()函数声明:

char* strcpy(char* destination,const char* source);

strcpy的功能是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 ‘\0’ 也复制到目标空间。

1. 函数的参数:

char* destination---------目标字符串的首地址
const char* source------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串

2.函数的返回值类型:

char*:返回的是目标字符串的首地址

二、strcpy函数的使用

#include <stdio.h>
#include <string.h>

int main()
{
	char arr[10] = "########";
	char err[10] = "hello";
	strcpy(arr, err);
	printf("%s\n", arr);
	return 0;
}

在这里插入图片描述

三、strcpy函数的注意事项

1.源字符必须以 '\0’结束:

#include <stdio.h>
#include <string.h>

int main()
{
	char arr[10] = "##########";
	char err[] = { 'a','b','c','d' };
	printf("%s\n", strcpy(arr, err));
	return 0;
}

程序报错,运行异常。因为,我们知道‘\0’是strcpy函数停止拷贝的终止条件。err字符数组所在的内存空间后面存储的内容并不知道,不遇到 ‘\0’ 拷贝就不会停止,这就会导致越界访问,程序就会出现问题。

2.目标空间必须足够大,以确保能放源字符串

#include <stdio.h>
#include <string.h>

int main()
{
	char arr[5] = "###";
	char err[] = "hello world";
	strcpy(arr, err);
	printf("%s\n", arr);
	return 0;
}

运行结果
在这里插入图片描述
这里虽然拷贝成功并将结果输出了,但程序却崩溃了。目标空间太小,不足以放置拷贝的源字符串,会造成溢出的情况。

3.目标空间必须可变

int main()
{
	char* p = "hello world";
	char arr[10] = "*********";
	printf("%s\n", strcpy(p, arr));
	return 0;
}

程序错误,无法复制。这是因为由char* strcpy(char* destination,const char* source);可知,也就是说它要复制的那块空间必须是可以变化的。但是,在这里p是一个指针,它指向了一个常量空间,常量空间是无法改变的。所以,程序错误。

四、strcpy函数的模拟

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* arr, const char* err)
{ 
    assert(arr!=NULL);
    assert(err !=NULL
	char* start = arr;//保存arr的数组首地址,便于return
	//下面的部分可以写成
	
	//  while(*arr++ = *err++){}   //
	while (*err != '\0')//遍历err数组
	{
		*arr = *err;//解引用,将对应的元素拷贝
		arr++;//arr数组+1
		err++;//err数组+1
	}
	*arr = *err;//while循环到'\0'就结束了,所以还需要将\0赋值过去。
	return start;
}
int main()
{
	char arr[10] = "*********";
	char err[5] = "lili";
	printf("%s", my_strcpy(arr, err));
	return 0;
}

运行结果
在这里插入图片描述

strncpy函数

一、strncpy函数的简介

1.下面是库中的strcpy()函数声明:

 char *strncpy(char *dest, const char *src, int n)

n:要拷贝的个数,即:将src中前n个字符赋值到dest中。

2.使用细节

1、当src字符串长度小于n时,则拷贝完字符串后,剩余部分将用空字节填充,直到n个
2. strncpy不会向dest追加’\0’。

二 、区别

与strcpy的区别
1、strcpy() 函数用来复制字符串;strncpy()用来复制字符串的前n个字符,所以要多传一个参数n

1)char *strcpy(char *dest, const char *src);

2)char * strncpy(char *dest, const char *src,size_t n);

2、不像strcpy(),strncpy()不会向dest追加结束标记’\0’

三、strcnpy模拟

#include <stdio.h>
#include<string.h>
#include <assert.h>
 
//dest为目标数组,src为源数组,n为要复制的字符个数
char* My_strncpy(char* dest, const char* src, int n)
{
	assert(dest != NULL);//保证dest非空
	assert(src != NULL); //保证src非空
	char* ret = dest;    //将dest首地址储存在ret中,在之后dest++运算中,可以方便找到
	while (n)   //一次复制一个字符,要复制n次
	{
		*dest = *src;  //复制
		src++;    //源地址往后+1
		dest++;   //目标地址往后+1
		n--;      //跳出循环条件
	}
	return ret;  //返回目的数组的首地址
}
int main()
{
	char arr1[] = "I LOVE YOU";
	char arr2[] = "SORRY";
	My_strncpy(arr1, arr2,5);
	//经过函数My_strncpy后 ,arr1里应该是字符串 SORRYE YOU
	printf("arr1: %s\n", arr1);
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿然成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值