【C语言】处理字符串和字符的相关库函数详细介绍!!!

目录

求字符串长度

strlen

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

strcpy

strcat

strcmp

长度受限制的字符串函数介绍

strncpy

strncat 

strncmp 

字符串查找

strstr 

strtok

错误信息报告

strerror 

字符分类函数

字符大小写转换 

内存操作函数

memcpy 

memmove

memcmp

memset 

代码仓库 


求字符串长度

strlen

1. 函数介绍

size_t strlen(const char *str);

1. 字符串把 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数,不包含 '\0'。

2. 参数指向的字符串必须要以 '\0' 结束。

3. 注意函数的返回值为size_t,是无符号的。

2. 模拟实现 

//方法1
size_t my_strlen(const char* p)
{
	assert(p);
	size_t count = 0;
	while (*p != '\0')
	{
		p++;
		count++;
	}
 
	return count;
}
//方法2 指针减指针
size_t my_strlen(const char* p)
{
	char* cur = p;
	while (*cur != '\0') cur++;

	return cur - p;
}
//方法3 递归
size_t my_strlen(const char* p)
{
	if (*p == '\0') return 0;

	return 1 + my_strlen(++p);
}

int main()
{
	printf("%d\n", my_strlen("abcc"));

	return 0;
}

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

strcpy

1. 函数介绍

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

1. 将 source 所指向的字符串拷贝到 destination 所指向的空间,包括 '\0'。

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

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

4. 目标空间必须可修改。

5. 返回目标空间的地址。

2. 模拟实现

char* my_strcpy(char* dst, const char* src)
{
	assert(dst && src);
	char* sta = dst;
	while (*dst++ = *src++);

	return sta; //这里不能直接返回dst,因为dst已经加加了
}

int main()
{
	char a[] = "xxxxxxxxx";
	char b[] = "abcd";
	my_strcpy(a, b);
	my_strlen(a);

	return 0;
}

strcat

1. 函数介绍

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

1. 把源头的数据追加到目的地,返回目的地的地址。

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

3. 目标空间必须有足够的大,能容纳下源字符串的内容。

4. 目标空间必须可修改。

5. 字符串自己给自己追加,如何?不行,永远遇不到 '\0'。

2. 模拟实现 

char* my_strcat(char* dst, const char* src)
{
	assert(dst && src); //保证指针有效性
	char* sta = dst; 
	while (*dst) dst++;
	while (*dst++ = *src++);

	return sta;
}

int main()
{
	char a[20] = "abcd";
	char b[] = "xxx";
	printf("%s\n", my_strcat(a, a));

	return 0;
}

strcmp

1. 函数介绍

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

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

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

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

4. 判断的原理?从第一个开始比较ASCII码值,相等就下一个,不相等就出结果。

2. 模拟实现 

int my_strcmp(const char* str1, const char* str2)
{
	//相等我就加加
	while (*str1 == *str2)
	{
		//等于\0
		if (!(*str1)) return 0;
		str1++;
		str2++;
	}
	//跳出循环意味着不相等
	return *str1 - *str2;
}

int main()
{
	printf("%d\n", my_strcmp("abd", "abd"));

	return 0;
}

长度受限制的字符串函数介绍

strncpy

1. 函数介绍

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

1. 从源字符串拷贝num个字符到目标空间。

2. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。


strncat 

1. 函数介绍

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

1. 将源字符串追加num个到目标字符串后面,后面会补'\0'。

2. 如果num大于源字符串,则源字符串有多少个就追加多少个。


strncmp 

1. 函数介绍

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

1. 只比较前num个字符


字符串查找

strstr 

1. 函数介绍

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

1. 在str1中找str2第一次出现的位置,返回这个位置的地址。

2. 模拟实现 

char* my_strstr(const char* str1, const char* str2)
{
	if (*str2 == '\0') return str1; //特殊处理
	char* tag = str2;
	while (*str1)
	{
		//先在str1找到和str2第一个字符一样的字符
		while (*str1 != *str2) str1++;
		char* ret = str1;
		//判断是否存在和整个str2一样的字符串
		while (*str1 == *str2)
		{
			str1++;
			str2++;
		}
		//这里跳出意味着遇到了不一样字符
		if (*str2 == '\0') return ret;
		//继续找
		else
		{
			str1 = ret + 1;
			str2 = tag;
		}
	}

	return NULL;
}

int main()
{
	char str1[] = "adcgbcdggg";
	char str2[] = "a";
	char* ret = my_strstr(str1, str2);
	if (!ret) printf("not find\n");
	else printf("%s\n", ret);

	return 0;
}

strtok

1. 函数介绍

char* strtok(char* str, const char* sep);

1. sep参数是个字符串,定义了用作分隔符的字符集合。

2. 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。

3. strtok函数可以找到str中的标记(分隔符前面的字符串),并将分割符改成 \0 ,返回这个标记的指针(分隔符前面的字符串的地址)。

4. strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。

4. strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

5. strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

6. 如果字符串中不存在更多的标记,则返回 NULL 指针。


错误信息报告

strerror 

1. 函数介绍

char* strerror(int errnum);

1. 返回错误码所对应的错误信息。

2. 库函数在执行的时候发生错误时,会将一个错误码存放在errno变量中,这个变量是C语言提供的一个全局变量。

3. 返回对应错误信息字符串的首地址。


字符分类函数


字符大小写转换 

int tolower(int c); //转小写
int toupper(int c); //转大写

1. 将字符串转小写

int main()
{
	char arr[] = "Fight, Fight, Fight";
	char* cur = arr;
	while (*cur)
	{
		if (isupper(*cur))
		{
			*cur = tolower(*cur); //返回改成小写的值
		}
		cur++;
	}
	printf("%s\n", arr);

	return 0;
}

内存操作函数

memcpy 

1. 函数介绍

void* memcpy(void* destination, const void* source, size_t num);

1. 从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的地址

2. 这个函数在遇到 '\0' 的时候并不会停下来。

2. 模拟实现 

void* my_memcpy(void* dst, const void* src, size_t num)
{
	assert(dst && src);
	void* ret = dst;
	while (num--)
	{
		*(char*)dst = *(char*)src;
		++(char*)dst;
		++(char*)src; 
	}

	return ret;
}

int main()
{
	int arr1[] = { 1, 2, 3 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 8);

	return 0;
}

3. memcpy无法处理source与destination有任何的重叠。 


memmove

1. 函数介绍

void* memmove(void* destination, const void* source, size_t num);

1. 和memcpy的参数,用法一样。

2. 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

3. 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

2. 模拟实现

void* my_memmove(void* dst, const void* src, size_t num)
{
	assert(dst && src);
	void* ret = dst;
	if (dst < src)
	{
		//从前向后拷贝
		while (num--)
		{
			*(char*)dst = *(char*)src;
			++(char*)dst;
			++(char*)src;
		}
	}
	//从后向前拷贝
	else while (num--) *((char*)dst + num) = *((char*)src + num);

	return ret;
}

int main()
{
	int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	my_memmove(arr1 + 2, arr1, 20);

	return 0;
}

memcmp

1. 函数介绍

int memcmp(const void* ptr1, const void* ptr2, size_t num);

1. 比较从ptr1和ptr2指针开始的num个字节。

2. 相等返回0,ptr1小于ptr2返回小于0,ptr1大于ptr2返回大于0。


memset 

1. 函数介绍

void* memset(void* ptr, int value, size_t num);

1. 把ptr指向的空间前num个字节设置成value。

将前十个字节变成1


代码仓库 

CharacterString/CharacterString/main.c · 林宇恒/code_c - 码云 - 开源中国 (gitee.com)

  • 41
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
"C语言字符串处理库函数大全-简书"是一篇在简书上的教程,介绍C语言中常用的字符串处理库函数。 该教程详细介绍C语言字符串操作的相关函数,包括库函数的使用方法和示例代码。通过该教程,读者可以学习到如何使用C语言中的字符串处理函数来进行字符串的复制、连接、比较、查找、截取等操作。 在这篇教程中,读者可以了解到以下一些常见的字符串处理库函数: 1. strcpy:用于将一个字符串复制到另一个字符串中。 2. strcat:用于将一个字符串连接到另一个字符串的末尾。 3. strlen:用于计算一个字符串的长度。 4. strcmp:用于比较两个字符串的大小。 5. strchr:用于在一个字符串中查找指定字符的第一次出现位置。 6. strstr:用于在一个字符串中查找指定子串的第一次出现位置。 7. strtok:用于将一个字符串按照指定的分隔符分割成多个子串。 8. strncpy:用于将指定长度的字符串复制到目标字符串中。 9. strncmp:用于比较指定长度的两个字符串。 10. sprintf:用于将格式化的字符串输出到一个字符数组中。 这些函数C语言中非常常用,并且对于字符串处理非常方便。通过学习和掌握这些字符串处理库函数,可以更加高效地完成C语言程序中的字符串操作。 总之,"C语言字符串处理库函数大全-简书"这篇文章提供了丰富的字符串处理库函数以及示例代码,对于C语言开发者来说是一个很好的参考和学习资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值