【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)

相关推荐

  1. C语言字符函数字符串函数

    2024-07-16 13:46:01       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 13:46:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 13:46:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 13:46:01       58 阅读
  4. Python语言-面向对象

    2024-07-16 13:46:01       69 阅读

热门阅读

  1. TCP、UDP、TCP与UDP的区别及联系

    2024-07-16 13:46:01       25 阅读
  2. 多线程-CompletableFuture类

    2024-07-16 13:46:01       25 阅读
  3. window下minio的备份

    2024-07-16 13:46:01       19 阅读
  4. 运动控制:编码器滤波

    2024-07-16 13:46:01       15 阅读
  5. 数据分析常用工具汇总

    2024-07-16 13:46:01       20 阅读
  6. Sklearn 入门教程:开启机器学习之旅

    2024-07-16 13:46:01       19 阅读
  7. Swift入门笔记

    2024-07-16 13:46:01       20 阅读
  8. 【Linux命令 香橙派AI pro】使用命令连接wifi

    2024-07-16 13:46:01       20 阅读
  9. 常见逻辑漏洞举例

    2024-07-16 13:46:01       24 阅读
  10. Codeforces Round 958 (Div. 2)

    2024-07-16 13:46:01       23 阅读