栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 字符串函数及其实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 字符串函数及其实现

1、strlen

​ 字符串已经 ‘’ 作为结束标志,strlen函数返回的是在字符串中 ‘’ 前面出现的字符个数(不包
含 ‘’ )。
size_t strlen ( const char * str );

参数指向的字符串必须要以 ‘’ 结束。
注意函数的返回值为size_t,是无符号的( 易错 )

 strlen("abc")-strlen("abcdef")  // 返回值都是大于 0 的  运算结果也大于0

实现 my_strlen

size_t my_strlen(char *str){ 		//size_t 是 unsigned int
    //assert(str); 判断str 是否为NULL
	int ret=0;
	while(*str!=''){
		ret++;
		str++;
	}
	return ret;
}
2、strcpy
  • 源字符串必须以 ‘’ 结束。
  • 会将源字符串中的 ‘’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变
char* my_strcpy(char *str1,const char *str2){
	//assert(str1&&str2);
	char *ret=str1;
	while(*str1++=*str2++){
		;
	}
	return ret;
}
3、strcat
char * strcat( char * str1 ,  const char * str2  )

在 str1 后面追加 str2

  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。
  • 不允许自己给自己追加 ,末尾的 ‘’ 被覆盖,会陷入死循环
char* my_strcat(char *str1,const char *str2){
	assert(str1&&str2);
	char *ret=str1;
	while(*str1){
		str1++;
	}
	while(*str1++=*str2++){
		;
	}
	return ret;
}
4、 strcmp

标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

大于和小于 是 对比不相等的那个字符的大小

int my_strcmp(const char *str1,const char *str2){
    //assert(str1&&str2);
	while(*str1==*str2){
		if(*str1=='')  return 0; 
		str1++;
		str2++;
	}
	return (*str1-*str2);
}
长度受限制的字符串函数 strncpy
  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
char* my_strncpy(char *str1,const char *str2,int n){
    //assert(str1&&str2);
	char*ret=str1;
	for(int i=0;i
		*(str1+i)=*(str2+i);
		if(*(str1+i)=='') break;
	}
	return ret;
}
strncat
  • 将 src 的前num个字符追加到目标,加上一个终止空字符。
  • 如果 src 中C字符串的长度小于num,则只复制终止空字符之前的内容。
 
strncmp 
  • 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
int my_strncmp(const char *str1,const char *str2,int n){
    //assert(str1&&str2);
	while(*str1==*str2&&--n){
		if(*str1=='')  return 0; 
		str1++;
		str2++;
	}
	return (*str1-*str2);
}
5、strstr

字符串查找字串

char* my_strstr(const char *str1,const char *str2){
	const char *s1,*s2;
	const char *p =str1;
	while(*p){
		s1=p;
		s2=str2;
		while(*s2 && !(*s1-*s2) ){
			s1++;
			s2++;
		}
		if(!*s2)  return (char*)p;
		p++;
	}
	return NULL;
}
6、strtok
char * strtok ( char * str, const char * sep );

sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
记。

​ strtok函数找到str中的下一个标记,并将其用 结尾,返回一个指向这个标记的指针。(注:
​ strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
​ strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
​ strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
​ 如果字符串中不存在更多的标记,则返回 NULL 指针。

用法:

	char *p = "zhangpengwei@bitedu.tech";
	const char* sep = ".@";
	char arr[30];
	char *str = NULL;
	strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
	for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep)){
		printf("%sn", str);
	}
7、strerror
char * strerror ( int errnum );
  • 返回错误码,所对应的错误信息
#include 
#include 
#include //必须包含的头文件
int main ()
{

 FILE * pFile;
 pFile = fopen ("unexist.ent","r");
 if (pFile == NULL)
  printf ("Error opening file unexist.ent: %sn",strerror(errno));
  //errno: Last error number   errno是自带的全局变量
 return 0;
}
字符分类函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOGUrUsg-1658208840319)(E:Typora比特C比特C .assets1658173686757.png)]

字符转换函数:
int tolower ( int c );    // 转成小写
int toupper ( int c );	  // 转成大写
8、mencpy
  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 ‘’ 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。
void* my_memcpy(void *str1,const void *str2,size_t num){
	assert(str1&&str2);
	void *ret=str1;
	while(num--){
		*(char*)str1=*(char*)str2; 
		str1=(char*)str1+1;
		str2=(char*)str2+1;
	}
	return ret;
}
9、memmove
void * memmove ( void * destination, const void * source, size_t num );

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

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

void* my_memmove(void *dest,const void *src,size_t num){
	assert(dest&&src);
	void *ret=dest;
	if(dest<=src){
		while(num--){
			*(char*)dest=*(char*)src; 
			dest=(char*)dest+1;
			src=(char*)src+1;
		}
	}
	else{
		while(num--){
			*( (char*)dest +(char)num )=*( (char*)src +(char)num ); 
		}
	}
	return ret;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018889.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号