潜学C语言——字符串,内存函数介绍2

105 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。​

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

//错误的示范
char arr2[] = {'a','b','c'};

2.会将源字符串中的'\0'拷贝到目标空间

3.目标空间必须足够大,以确保可以存放源字符串

模拟实现:

 char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	//拷贝src指向的字符串到dest指向的空间,包含'\0'
	while (*dest++ = *src++)
	{
		;
	}
	//返回目的空间的起始地址
	return ret;
}
int main()
{
	char arr1[] = "abcdefghi";
	char arr2[] = "bit";

	my_strcpy(arr1, arr2);//
	printf("%s\n", arr1);

	return 0;
}

2.2 strcat

 功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。

返回指向dest的指针

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

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

2.目标空间必须足够大,以确保可以容纳下源字符串的内容

3.目标空间必须可修改

int main()
{
	char arr1[] = "hello";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}

9%KW49I~XMW9IJV7RIF43LR.png

​​

虽然可以将world加到hello的后面,但是却报错了这是为什么呢?

这是因为arr1周围栈区损坏,arr1中的位置不够

int main()
{
	char arr1[30] = "hello";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}

模拟实现: 

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest !=NULL);
	assert(src != NULL);

	//1.找到目的字符串的'\0'
	while (*dest != '\0')
	{
		dest++;
	}
	//2.追加
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[30] = "hello";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}

2.3 strcmp

int strcmp(const char* str1, const char* str2);

第一个字符串大于第二个字符串,则返回大于0的数字

第一个字符串等于第二个字符串,则返回0

第一个字符串小于第二个字符串,则返回小于0的数字