IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言 字符串函数及其实现 -> 正文阅读

[C++知识库]C语言 字符串函数及其实现

1、strlen

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

参数指向的字符串必须要以 ‘\0’ 结束。
注意函数的返回值为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!='\0'){
		ret++;
		str++;
	}
	return ret;
}

2、strcpy

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变
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

  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。
  • 不允许自己给自己追加 ,末尾的 ‘\0’ 被覆盖,会陷入死循环
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=='\0')  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<n;i++){
		*(str1+i)=*(str2+i);
		if(*(str1+i)=='\0') 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=='\0')  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中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
? 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("%s\n", str);
	}

7、strerror

char * strerror ( int errnum );
  • 返回错误码,所对应的错误信息
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{

 FILE * pFile;
 pFile = fopen ("unexist.ent","r");
 if (pFile == NULL)
  printf ("Error opening file unexist.ent: %s\n",strerror(errno));
  //errno: Last error number   errno是自带的全局变量
 return 0;
}

字符分类函数

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

字符转换函数:

int tolower ( int c );    // 转成小写
int toupper ( int c );	  // 转成大写

8、mencpy

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
  • 如果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;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:19:47  更:2022-07-21 21:22:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 15:18:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码