C语言学习NO.12-字符函数(二)-strcpy,strcat,strcmp长度不受限制的字符串函数

发布时间:2024年01月06日

一、strcpy的使用和模拟实现

(一)strcpy使用

//strcpy的使用
#include <stdio.h>

int main()
{
	char arr1[] = "abcdef";
	char arr2[10] = "qwertt";
	char arr3[10] = "okl";
	strcpy(arr2, arr1);
	printf("arr2 = %s\n", arr2); 
	strcpy(arr2, arr3);
	printf("arr1 = %s\narr2 = %s\narr3 = %s", arr1,arr2,arr3);
	return 0;
}

(二)strcpy使用的注意事项

? 注意strcpy需要包含的头文件是 <string.h>

? 源字符串必须以 '\0' 结束,会将源字符串中的 '\0' 拷贝到目标空间。

? 目标空间必须足够大,以确保能存放源字符串。

? 目标空间必须可修改。

?strcpy函数返回的是目标空间的起始地址

如下例,字符中的'\0'也会同样被赋值进目标空间。

#include <stdio.h>

int main()
{
	char arr1[] = "xxxxxxxxxx";
	char arr2[] = "abc";

	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

当源字符串空间大于目标空间时,使用strcpy函数会有怎样的结果?

系统会报错。

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "xxxxxxxxxx";
	char arr2[] = "abc";

	strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

(三)strcpy的模拟实现

strcpy函数返回的是目标空间的起始地址

strcpy函数的返回类型的设置是为了实现链式访问

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

char *my_strcpy(char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str2)
	{
		*str1 = *str2;
		++str1;
		++str2;
		if (*str2 == '\0')
			*str1 = *str2;
	}
	return str1;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "qwert";
	my_strcpy(arr1,arr2);
	printf("%s", arr1);
	return 0;
}

进行优化

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

char* my_strcpy(char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1++ = *str2++)
	{
		;
	}
	return str1;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "qwert";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

二、strcat的使用和模拟实现

(一)strcat使用

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

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "poiuy";
	strcat(arr1, arr2);
	printf("arr1=%s\narr2=%s", arr1, arr2);
	return 0;
}

(二)strcat使用的注意事项

  • 注意strcpy需要包含的头文件是 <string.h>
  • 源字符串必须以 '\0' 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

(三)strcat的模拟实现

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest)//找目标字符串中的'\0'
	{
		dest++;
	}
	while (*dest++ = *src++)//附加字符串
	{
		;
	}
	return ret;
}


int main()
{
	char arr1[20] = "asdfg";
	char arr2[] = "mnbvc";

	my_strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

(四)字符串自身附加

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest)//找目标字符串中的'\0'
	{
		dest++;
	}
	while (*dest++ = *src++)//附加字符串
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = "asdfg";
	my_strcat(arr, arr);
	printf("%s", arr);
	return 0;
}

存在错误,自身附加自身的字符串时,字符串的'\0'很容易被覆盖。

三、strcmp的使用和模拟实现

(一)strcmp使用

#include <stdio.h>
#include <string.h>
int main()

{
	char arr1[] = "asdfgh";
	char arr2[] = "ascfgh";
	char arr3[] = "asdfghj";
	char arr4[] = "asdfghj";
	int ret1 = strcmp(arr2, arr1);
	int ret2 = strcmp(arr3, arr1);
	int ret3 = strcmp(arr2, arr3);
	int ret4 = strcmp(arr4, arr3);
	printf("%d %d %d %d", ret1, ret2, ret3,ret4);

	return 0;
}

(二)strcmp使用的注意事项

  • 此函数开始比较每个字符串的第一个字符。如果它们彼此相等则继续比较后续的字符相应,直到字符不同或终止达到null字符。
  • 标准规定
    • 第一个字符串大于第二个字符串,则返回大于0的数字
    • 第一个字符串等于第二个字符串,则返回0
    • 第一个字符串小于第二个字符串,则返回小于0的数字

(三)strcmp的模拟实现


#include <stdio.h>
#include <assert.h>

int* my_strcmp(char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1 == *s2)
	{
		if(*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	if (*s1 > *s2)
		return 1;
	else
		return -1;
}

int main()
{
	char arr1[] = "asdfgh";
	char arr2[] = "asdfg";

	int ret = my_strcmp(arr1, arr2);
	printf("%d", ret);
	return 0;
}

文章来源:https://blog.csdn.net/Z1125994/article/details/135416874
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。