字符串函数

本文详细介绍了C语言中几个重要的字符串处理函数,包括strlen用于计算字符串长度,strcpy用于字符串拷贝,strcat用于字符串连接,strcmp进行字符串比较,以及它们的限制版本如strncpy,strncat和strncmp。还探讨了如何模拟实现这些函数,并提供了示例代码。另外,文章提到了strstr函数,用于在字符串中查找子字符串。
摘要由CSDN通过智能技术生成

一、长度不受限制的字符串函数

1.strlen

1)strlen的使用

size_t strlen ( const char * str );//函数参数是字符串的起始地址
strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束。
函数的返回值为size_t,是无符号的

int main()
{
	char arr[] = "abcdef";//6
	//字符串结尾默认就存在'\0'
	char arr[10] = { 'a','b','c','d','e','f' };//6
	//数组已经设定了大小为10个元素,因此'f'后面的元素就默认为字符0,也就是'\0'
	char arr[] = { 'a','b','c','d','e','f' };//随机值
	int len = strlen(arr);
	printf("%d\n", len);
	return 0;
}

2)证明strlen的返回值是size_t

int main()
{
	if (strlen("abc") - strlen("qwerty") > 0)//结果是>
	//if ((int)strlen("abc") - (int)strlen("qwerty") > 0)//结果是<
	{
		printf(">\n");
	}
	else
	{
		printf("<\n");
	}
	return 0;
}

3)模拟实现strlen

1.计数器的方法

#include<assert.h>
size_t my_strlen(char* str)
{
	int count = 0;
	assert(str != NULL);
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;

2.递归的方法

int my_strlen(char* str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen(str+1);
	}
}
int main()
{
	char str[] = "abcdefg";
	printf("%d\n", my_strlen(str));
	return 0;
}

2.strcpy

strcpy - 字符串拷贝(将源字符串拷贝到目标字符串中)
char* strcpy(char* destination, const char* source);
注意:

1.源字符串必须以 ‘\0’ 结束,并并且会将源字符串中的 ‘\0’ 拷贝到目标空间。
2.目标空间必须足够大,以确保能存放源字符串;目标空间必须可变
3.strcpy函数返回的是目标空间的起始地址。strcpy函数的返回类型的设置是为了实现链式访问

1)strcpy的使用

int main()
{
	char arr1[] = "qwertyuiop";
	char arr2[] = "def";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

2)模拟实现strcpy

#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "qwertyuiop";
	char arr2[] = "def";
	//char* ret = my_strcpy(arr1, arr2);
	//printf("%s\n",ret); 也可以写成
	printf("%s\n", my_strcpy(arr1, arr2));
	return 0;
}

3.strcat

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

注意:

1.将源字符串追加到目标字符串后面
2.源字符串必须以 ‘\0’ 结束。
3.目标空间必须有足够的大,能容纳下源字符串的内容,目标空间必须可修改
4.字符串不能自己给自己追加

1)strcat的使用

int main()
{
	char arr1[50] = "qwertyuiop";
	char arr2[] = "def";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

2)模拟实现strcat

#include<assert.h>
char* my_strcat(char* dest, char* src)
{
	assert(*dest && *src);
	char* ret = dest;
	//找到目标空间中的'\0'
	while (*dest)
	{
		dest++;
	}
	//拷贝
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "qwertyuiop";
	char arr2[] = "def";
	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

4.strcmp

int strcmp(const char* str1, const char* str2);
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
(在vs环境下,大于0,返回的是1;小于0,返回的是-1)

注意:

strcmp函数比较的不是字符串的长度!!!!而是比较字符串中对应位置上的字符的大小。如果相同,就比较下一对儿,直到不同或者都遇到’\0’

1)strcmp的使用

int main()
{
	char arr1[] = "qwertyuiop";
	char arr2[] = "def";
	int ret = strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

2)模拟实现strcmp

#include<assert.h>
int my_strcmp(const char* str1,const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;//相等
		}
		str1++;
		str2++;
	}
	//不相等
	if (str1 > str2)
		return 1;
	else
		return -1;
	//不相等
	//return (*str1 - *str2);
}
int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abdc";
	int ret = my_strcmp(arr1,arr2);
	//if (ret >0)
	//{
	//	printf(">\n");
	//}
	//else if (ret == 0)
	//{
	//	printf("== \n");
	//}
	//else
	//{
	//	printf("<\n");
	//}
	printf("%d\n", ret);
	return 0;
}

二、长度受限制的字符串函数

1.stncpy

char * strncpy ( char * destination, const char * source, size_t num );
注意:拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的 后边追加0,直到num个。

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "qwe";

	strncpy(arr1, arr2, 5);//监视窗口
	printf("%s\n", arr1);
	return 0;
}

image-20230518202918106

2.strncat

 char * strncat ( char * destination, const char * source, size_t num );

如果字符串的长度小于num,依然追加arr2字符串的内容,不用非得是5个字符
字符串可以自己追加自己

int main()
{
	char arr1[20] = "abcdef\0XXXXXXXX";
	char arr2[] = "qwe";
	strncat(arr1, arr2, 5);
	printf("%s\n", arr1);

	return 0;
}

image-20230518203218587

3.strcmp

int strncmp ( const char * str1, const char * str2, size_t num );

比较num 个字符

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdq";
	int ret = strncmp(arr1, arr2, 4);
	
	printf("%d\n", ret);

	return 0;
}

三、strstr

char * strstr ( const char *str1, const char * str2);

在字符串arr1中查找是否存在arr2这个子字符串

1.strstr的使用

int main()
{
	char arr1[] = "abcabcabcd";
	char arr2[] = "abcd";

	printf("%s\n", strstr(arr1, arr2));
	return 0;
}

2.模拟实现strstr

#include<assert.h>
char* strstr(const char* str1,const char* str2)
{
	assert(str1 && str2);
	const char* s1 = str1;
    const char* s2 = str2;
	while (*s1)
	{
		if (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		else
		{
			str1++;
			s1 = str1;
			s2 = str2;
		}
	}
	if (*str1 == '\0')
	{
		return NULL;
	}
	return (char*)str1;

}
int main()
{
	char arr1[] = "abcabcabcd";
	char arr2[] = "cbcd";
	char* ret = strstr(arr1, arr2);
	if (NULL == ret)
	{
		printf("找不到字串\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值