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

字符串函数

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

cpp 复制代码
//求字符串长度
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;
}
  1. strcpy 字符串拷贝

cpp 复制代码
//求字符串拷贝
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 字符串连接

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

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

cs 复制代码
//字符串连接
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-字符串比较函数。

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

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

cpp 复制代码
//求字符串比较函数
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;
}

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

1.strncpy -字符串拷贝。

2.strncat(字符串连接)

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

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

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

cpp 复制代码
//模拟实现一下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;
}

strtok函数


cs 复制代码
//strcok()函数
#include <string.h>
int main()
{
	char arr1[] = "[email protected]";
	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;
}
  1. strerror?函数的使⽤?

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

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

4.memcpy -内存拷贝

cpp 复制代码
模拟实现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;
}
//不能解决重叠问题
重叠问题

memmove使⽤和模拟实现

cpp 复制代码
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;
}
//不能解决重叠问题

memset函数的使⽤

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

memcmp函数的使⽤

相关推荐
带刺的坐椅5 分钟前
qwen3 惊喜发布,用 ollama + solon ai (java) 尝个鲜
java·spring·solon·solon-ai·qwen3
Vacant Seat33 分钟前
贪心算法-跳跃游戏II
算法·游戏·贪心算法
小柒的博客36 分钟前
联合体union的特殊之处
c语言·机器人
.生产的驴39 分钟前
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
java·开发语言·spring boot·后端·前端框架
夜松云42 分钟前
从对数变换到深度框架:逻辑回归与交叉熵的数学原理及PyTorch实战
pytorch·算法·逻辑回归·梯度下降·交叉熵·对数变换·sigmoid函数
Howard_Stark42 分钟前
Spring的BeanFactory和FactoryBean的区别
java·后端·spring
饮长安千年月43 分钟前
学生管理系统审计
java·网络安全·代码审计
八股文领域大手子1 小时前
深入浅出限流算法(三):追求极致精确的滑动日志
开发语言·数据结构·算法·leetcode·mybatis·哈希算法
-曾牛1 小时前
Spring Boot中@RequestParam、@RequestBody、@PathVariable的区别与使用
java·spring boot·后端·intellij-idea·注解·spring boot 注解·混淆用法
新时代苦力工1 小时前
处理对象集合,输出Map<String, Map<String, List<MyObject>>>格式数据,无序组合键处理方法
java·数据结构·list