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函数的使⽤

相关推荐
Jerry2 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry4 小时前
LeetCode 459. 重复的子字符串
算法
闲猫7 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
海石7 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石7 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
gugucoding8 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
自信的未来8 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
Brookty8 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
Jerry9 小时前
LeetCode 151. 反转字符串中的单词
算法