C语言:字符串函数功能实现——strcpy

C语言:字符串函数功能实现——strcpy,第1张

C语言:字符串函数功能实现——strcpy

文章目录
  • strcpy字符串拷贝/调换
    • 1利用数组实现
    • 2指针实现
    • 内置字符串拷贝函数strcpy
    • 内置字符串拷贝函数strcpy_s


strcpy字符串拷贝/调换

  将src(源)地址中的内容拷贝到des(目标)地址。

1利用数组实现
#include
#include

//while循环
void Mystrcpy(char* des, char* src)//字符串调换
{
	assert(des != NULL && src != NULL);//断言,需要头文件#include

	int i = 0;
	while (src[i] != '')
	{
		des[i] = src[i];
		i++;
	}
	des[i] = '';
}

//for循环
void Mystrcpy(char* des, const char* src)//当做数组使用,字符数组
{
    assert(des != NULL && src != NULL);
    
	int i = 0;
	for (; src[i] != ''; i++)
	{
		des[i] = src[i];
		//src[i] = 'a';//src[i] == *(src+i)不允许出现在左值(具有const限定符,不能修改其值)
	}
	des[i] = '';
}
int main()
{
	char frr[100] = "hello";
	char hrr[] = "world";
	Mystrcpy(frr, hrr);
	printf("%sn", frr);

	return 0;
}
2指针实现
#include
#include

void Mystrcpy_0(char* des, const char* src)
{
    assert(des != NULL && src != NULL);
    
	for (; *src != ''; des++, src++)
	{
		*des = *src;
	}
	*des = '';
}

void Mystrcpy_1(char* des, const char* src)
{
    assert(des != NULL && src != NULL);
    
	while (*src != '')
	{
		*des++ = *src++;//*和++都属于二级,且自右向左,因此先进行des++,src++
	}                   //属于后置++,先进行赋值解引用,然后++
	*des = '';
}

void Mystrcpy_2(char* des, const char* src)
{
    assert(des != NULL && src != NULL);
    
	while (*des++ = *src++);//当des赋值为‘’时,判断为假,循环结束
}

char* Mystrcpy_3(char* des, const char* src)
{
    assert(des != NULL && src != NULL);
    
	char* p = des;
	while (*des++ = *src++);
	return p;
}

int main()
{
    char irr[] = "hello";
	char jrr[] = "world";
	char* str1 = irr;
	//char str2[10];
	char* str2 = jrr;
	//Mystrcpy_2(str2, str1);//无返回值
	//printf("%sn", str2);

	printf("%sn", Mystrcpy_3(str2, str1));//有返回值
	
	return 0;
}
内置字符串拷贝函数strcpy
  • char* strcpy(char* des, const char* src)
    • 具有返回值即字符串的首地址,支持字符串的链式表达
    • 需要头文件 #include
    • VS2019不能够直接使用,可以在开头添加取消错误提醒的声明 #define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include
#include

int main()
{
    char* str1 = "hello";
	char* str2 = "world";
	
	printf("%sn", strcpy(str2, str1));
	
    return 0;
}

char* str1 = “hello”;
不适用于VS2019,其中“const char * ”类型的值不能用于初始化 “char * “ 类型的实体
1、先声明使用字符数组,定义指针
2、直接强转
3、使用const修饰,在内置字符串拷贝函数strcpy时,const只能修饰src(源)

#define _CRT_SECURE_NO_WARNINGS
#include
#include

int main()
{
    char* str1 = "hello";
	char* str2 = "world";
	char irr[] = "abcde";//声明字符数组
	char* str1 = irr;
	char* str2 = (char*)"abcde"//强转
	//const char* str2 = "abcde"//const修饰
	
	printf("%sn", strcpy(str2, str1));
	
    return 0;
}
内置字符串拷贝函数strcpy_s
  • errno_t strcpy_s(char* des, size_t numberOfElements, const char* src)
    • 将src(源)地址中的内容拷贝到des(目标)地址。
    • numberOfElements为缓冲区的大小,其大于等于src+’’,且小于等于des
    • 返回值类型errno_t,用于判断是否复制成功。
    • des必须大于或等于src+’’的大小
#include
#include

int main()
{
    char irr[] = "hello";
	char jrr[10] = "world";
	char* str1 = irr;
	char* str2 = jrr;
	
	strcpy_s(str2, strlen(str1) + 1, str1);
	strcpy_s(str2, strlen(str2)+2, str1);//都可以
	strcpy_s(str2, sizeof(irr), str1);
	
	printf("%sn", strcpy(str2, str1));
	
    return 0;
}

注:
sizeof是求数组实际大小,包含’’
strlen是求数组有效元素的个数,不包含’’


此处sizeof是求数组irr实际大小,而不是指针str1的大小。
sizeof(str1)只是求指针的大小为4个字节。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4950280.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存