c语言字符串函数详解(全)

 字符串函数

1.strlen函数  求字符串长度的

3b35eb199cd0430fb3e8e7e5fc335220.png

a993220bfbba4ccfaaeb3d7b8312ccd7.png

11c1f0c3b33b45d39bb41a15534d03c1.png

836c4988d90e4dd8bedf539b4c23d1c9.png

bb63e47ff54443b8a33483bf292cc1e5.png

b62d5280c5344ea695f8212cf04e5e66.png



//求字符串长度
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		*str++;
		
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int red = my_strlen(arr);
	printf("%d\n", red);
	return 0;
}

2.  strcpy  字符串拷贝

78838a2286914b4e942f6eaa8c7ffbfb.png

992326c6adff41d6aea4c3e0640f734c.png7b3590430b6a424a8e263478e3144d0a.png

fadcde6fe1934434946c043eb97f5c27.png

846e16bff81045c7aae0bd5b2af8db6a.png

//求字符串拷贝
char* my_strcpy(char* arr2, char* arr1)
{
	char *red = arr2;
	while (*arr2++ = *arr1++)//'\0'赋给arr2时arr2为假就停止循环
	{
		;
	}
	return red;

}
int main()
{

	char arr1[] = { "abc" };
	char arr2[40] = { 0 };
	 my_strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

3、strcat  字符串连接

56f2507cb157429b8318b711907fae7e.png

9b6bce9f8621485d9b7068f6eb7a4406.png

3e7cfbfd28a84bcfb69d8e47ca486cf7.png

d8aed949c9d643f9a53a90ae1d6ec1d0.png

先找到需要连接的字符串末端'\0'处,然后拷贝

a20eae6b904046df82ddb744638a3ebb.png

拷贝是在\0这里进行拷贝。

//字符串连接
char* my_strcat(char* arr1, char* arr2)
{
	char* ret=arr1;
	while (*arr1 != '\0')
	{
		arr1++;
	}
	while (*arr1++ = *arr2++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[40] = { "hello" };
	char arr2[] = "bit";
	my_strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

4.strcmp-字符串比较函数。

3fef40e824594c87b6a73573d208211a.png

因为这个是二个不同的数组名,他们比较的肯定不一样,因为首元素地址不同,所以比较就不相同,这里比较的不是内容,是地址。

e5fd2abddb2141e7b809b53ed3dbec39.png

比较二个字符串应该用strcmp函数

f619af0b07374aebb816feac424e4e84.png

61cf29edf6754afcb11e6fcba6e7ed27.png

//求字符串比较函数
int my_strcmp(char* arr1, char* arr2)
{
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')
		{
			return 0;//相等
			arr1++;
			arr2++;
		}
		return (*arr1 - *arr2);
		
	}
}
int main()
{
	char arr1[] = "abc";
	char arr2[]="bcd";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0)
	{
		printf(">0\n");
	}
	else if (ret<0)
	{
		printf("<0\n");

	}
	else
	{
		printf("==0\n");

	}
	return 0;
}

eead6e8f7cb7448e98ffa242afa5874b.png

这个代码关键就是*arr1和*arr2相同的情况下遇到'\0时应该终止循环,返回相等。

232f2bd27ba74a6f9de66e2bceec748d.png

1.strncpy  -字符串拷贝。

70d1cb5b5bf548bdae99d135dfbe0d63.png

2.strncat(字符串连接)

e017ba5774d94e48b51aff8597a1f176.png

加了n就是加了限定的条件,比如strncmp

3.strstr -----查找子串

41b2d5f94cc14ca6aae50816b105bdc2.png

如果找到了子串就返回第一个字符的地址,也就是b字符的地址,因为是从b字符开始才算找到子串。找不到返回空指针,NULL

//模拟实现一下strstr
char* my_strstr(char* arr1, char* arr2)
{
	char* s1 = arr1;
	char* s2 = arr2;
	char* p = arr1;
	while (*p)
	{
		s1 = p;
		s2 = arr2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 =='\0')
		{
			return p;
        }
		p++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "www.h";
	char arr2[] = "w.h";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("子串不存在\n");
	}
	else
	{
	 printf("%s\n", ret);
	}
	return 0;
}

95ed4b4084524f92905c93d182223639.png

673f65abf03f48babe13a03b7176eebd.png


strtok函数

427bd67eb84b42ffbe84b538c24732f9.png
bb75a672aae7437c8ac37c241c0694ae.png

c66490507e684190bc5745b4bbc46682.png

//strcok()函数
#include <string.h>
int main()
{
	char arr1[] = "zhangsan@1666.com";
	char arr2[30] = { 0 };
	strcpy(arr2, arr1); 
	const char* p = "@.";
	char* s2 = NULL;

	// 初始化只是初始话一次
	for (s2= strtok(arr2, p); s2 != NULL; s2=strtok(NULL, p))
	{
		printf("%s\n", s2);
			
	}
	return 0;
}


3. strerror?函数的使⽤?

6a02b68072014643a83379769f7ee5b6.png

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。?
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明
的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动
的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应
的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是
有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。?

68625cc7fdd544cb90bf83b4b9c7ea78.png


#include <errno.h>
int main()
{
	for (int i = 0; i < 10; i++)
	{
		printf("%s\n", strerror(i));
	}
	return 0;
}

19808a9d82e242169f05ae92896d359b.png

96ef13a63dc6424a93a5343320385c65.png

4.memcpy  -内存拷贝

851d3c7f23ba44ddbe3a74216e71083b.png

4a8c58afac3f49c490ccf88f27e6e512.png

81e67cee758545f7b500564a0fc2c3d1.png


模拟实现memcpy函数
void* my_memcpy(void* dest, void* src,size_t num)
{
	char* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;

}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memcpy(arr1 + 2, arr1, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
 }
	return 0;
}
//不能解决重叠问题
重叠问题

6f7550548a08479688237b95f5efec43.png

3ee32f320cde4731967af3d4aab33722.png

memmove使⽤和模拟实现

3947e8552f0c4f6d86d4a22cd8f726f9.png

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1 + 2, arr1, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
 }
	return 0;
}
//不能解决重叠问题

2ab73a7200d84ac9be06e4edecfe743a.png

memset函数的使⽤

f056fe03e4854b07b32afd3431751ace.png

090ecb45d37548b2b29ca44a67c830bc.png

//memset内存设置
int main()
{
	char arr[] = "hello bite";
	memset(arr, 'x', 5);//以字节为单位来设置的
	printf("%s\n", arr);
	return 0;
}

 memcmp函数的使⽤

37593ba8b8924f69974f5e6c3ddb480d.png



  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值