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[] = "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;
}
  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函数的使⽤

相关推荐
励志成为嵌入式工程师1 分钟前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉32 分钟前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer36 分钟前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq38 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml41 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~1 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616881 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
wheeldown1 小时前
【数据结构】选择排序
数据结构·算法·排序算法
aloha_7892 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java2 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet