字符串、字符串函数

字符串

字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。

int main()
{
	//字符串其实是使用空字符\0结尾的一维字符数组
	//\0是字符串的结束标志
	//常量字符串不需要在末尾添加\0,编译器在初始化数组时会自动在末尾加上\0
	char arr1[] = "hello";
	//而以字符数组的方式表达字符串时,需要在末尾加上\0
	char arr2[] = { 'h', 'e', 'l', 'l', 'o', '\0' };

	//打印字符串,%s表示以字符串方式打印
	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

字符串函数

strlen函数

size_t strlen ( const char * str );

注:

  1. 字符串是以\0作为接受标志,strlen函数计算的是\0前面的字符的个数(不包括\0
  2. 参数指向的字符数组一定是要以\0结尾
  3. 函数的返回值是size_t类型,size_t表示的是unsigned int类型,是一个无符号整型(易错)

代码示例

//strlen函数需要引string.h头文件
#include <string.h>
int main()
{
	char str[] = "hello";
	printf("%d", strlen(str));
	return 0;
}

运行结果

5

模拟实现strlen函数

size_t my_strlen(const char* str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

//使用递归
size_t my_strlen1(const char* str)
{
	if (!*str)
		return 0;
	else
		return 1 + my_strlen1(str + 1);
}

//使用地址相减的方法
size_t my_strlen2(const char* str)
{
	int* p = str;
	while (*str)
		str++;
	return str - p;
}

int main()
{
	char str[] = "hello";
	printf("%d\n", my_strlen(str));
	printf("%d\n", my_strlen1(str));
	printf("%d\n", my_strlen2(str));
	return 0;
}

运行结果

5
5
5

strcpy函数

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

作用:

将源指向的C字符串复制到目标指向的数组中,包括终止的空字符(并在该点停止)。

注:

  1. 源字符串必须以\0结尾
  2. 会将源字符串的\0拷贝到目标字符串
  3. 目标字符串的空间一定要能够容纳下源字符串的内容

代码示例

int main()
{
	char str1[10] = "hello";
	char str2[10] = "world";

	//返回值为目标字符串的首地址
	char* res = strcpy(str2, str1);

	printf("str2 = %s\n", str2);
	printf("res = %s\n", res);

	return 0;
}

运行结果

str2 = hello
res = hello

模拟实现strcpy函数

char* my_strcpy(char* des, const char* source) 
{
	//如果为空,程序退出
	assert(des);
	assert(source);
	char* res = des;
	while (*des++ = *source++)
		;
	return res;
}

int main()
{
	char str1[10] = "hello";
	char str2[10] = "world";

	//返回值为目标字符串的首地址
	char* res = my_strcpy(str2, str1);

	printf("str2 = %s\n", str2);
	printf("res = %s\n", res);

	return 0;
}

运行结果

str2 = hello
res = hello

strcat函数

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

作用:

串联字符串,将源字符串的副本附加到目标字符串。目标中终止的空字符将被源的第一个字符覆盖,并且空字符将包含在由目标中的两个字符串联而成的新字符串的末尾

注:

  1. 源字符串必须以\0结束
  2. 目标字符串数组的空间足够容纳串联后的字符串
  3. 目标字符串必须可修改

代码示例

int main()
{
	char str1[20] = "hello";
	char str2[10] = "world";

	//返回值为目标字符串的首地址
	char* res = strcat(str1, str2);

	printf("str1 = %s\n", str1);
	printf("res = %s\n", res);

	return 0;
}

运行结果

str1 = helloworld
res = helloworld

模拟实现strcat函数

char* my_strcat(char* des, const char* src)
{
	assert(des);
	assert(src);
	char* res = des;
	while (*des)
		des++;
	while (*des++ = *src++)
		;
	return res;
}

int main()
{
	char str1[20] = "hello";
	char str2[10] = "world";

	//返回值为目标字符串的首地址
	char* res = my_strcat(str1, str2);

	printf("str1 = %s\n", str1);
	printf("res = %s\n", res);

	return 0;
}

运行结果

str1 = helloworld
res = helloworld

strcmp函数

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

作用:

比较两个字符串,此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或到达终止的空字符。

返回值

返回一个整数,表示字符串之间的关系:

返回值含义
<0第一个字符串大于第二个字符串
0第一个字符串等于第二个字符串
>0第一个字符串小于第二个字符串

代码示例

int main()
{
	char str1[] = "hello";
	char str2[] = "hi";
	char str3[] = "hi";

	int res1 = strcmp(str1, str2);
	int res2 = strcmp(str2, str3);
	printf("strcmp(str1, str2): %d\n", res1);
	printf("strcmp(str2, str3): %d\n", res2);

	return 0;
}

运行结果

strcmp(str1, str2): -1
strcmp(str2, str3): 0

模拟实时strcmp函数

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	int res = 0;
	while ((res = *str1 - *str2)==0 && *str1)
	{
		str1++;
		str2++;
	}
	if (res > 0)
		return 1;
	else if(res < 0)
		return -1;

	return res;
}

int main()
{
	char str1[] = "hello";
	char str2[] = "hi";
	char str3[] = "hi";

	int res1 = my_strcmp(str1, str2);
	int res2 = my_strcmp(str2, str3);
	printf("my_strcmp(str1, str2): %d\n", res1);
	printf("my_strcmp(str2, str3): %d\n", res2);

	return 0;
}

显示结果

my_strcmp(str1, str2): -1
my_strcmp(str2, str3): 0

strstr函数

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

作用:

返回指向str1中首次出现的str2的指针,如果str2不是str1的一部分,则返回空指针。

代码示例

int main() 
{
	char str[] = "This is a string.";

	//返回值为指向str2整个字符串在str1中第一次出现的指针,如果str1中不存在该序列,则为空指针。
	char* res = strstr(str, "is");

	printf("%c\n", *res);
	return 0;
}

模拟实现strstr函数

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	char* s1 = str1;
	char* s2 = str2;
	while (*str1)
	{
		if (*str1 == *str2) 
		{
			s1 = str1;
			while ((*str1 == *str2) && *str1)
			{
				str1++;
				str2++;
			}
			if (*str2 == 0)
				return s1;
			str1 = s1;
			str2 = s2;
		}
		str1++;
	}
	return NULL;
}

int main()
{
	char str[] = "This is a string.";

	//返回值为指向str2整个字符串在str1中第一次出现的指针,如果str1中不存在该序列,则为空指针。
	char* res = my_strstr(str, "b");

	if(res)
		printf("%c\n", *res);
	return 0;
}

本文出现任何错误,欢迎留言批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值