当前位置: 首页 > news >正文

c语言字符串函数strstr,strtok,strerror

1,strtok函数的使用和模拟实现

char * strtok(char * str,const char * sep)(分隔字符串的作用)

会有static修饰变量,有记忆功能,会保存字符串的位置,下次找再继续找。

1)sep参数指向一个字符串,它包含了0个或者多个由sep字符中一个或则多个分隔符分割的标记

2)第一个参数指定一个字符串,并将其用\0结尾,返回一个指向这个标记的指针。

3)strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

4)strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

5)如果字符串中不存在更多的标记,则返回NULL指针。

strtok函数和strcpy的使用

#include<stdio.h>
#include<string.h>
int main()
{char arr1[]="wangyiting@very.beautiful";char arr2[]={0};strcpy(arr2,arr1);//将arr1拷贝到arr2里面 char *sep="@.";//设置分隔符 char *ret=NULL;//初始化//for循环对字符串分隔 for(ret=strtok(arr2,sep);ret!=NULL;ret=strtok(NULL,sep)){printf("%s\n",ret);//换行打印出分隔开后的字符串 }return 0;} 

2,strstr的使用和模拟实现

const char * strstr (const char * str1,const char * str2);

功能:在str1中找到了str2这个字符串,第一次出现的位置如果找不到了,就返回第一次出现的起始地址后面的字符也会接着运行出来,如果找不到,就返回NULL。

#include<stdio.h>
#include<string.h>
int main()
{char arr1[]="abcdefg";char arr2[]="abc";//初始化 char *ret=strstr(arr1,arr2);//调用函数 if(ret==NULL)//进行判断 {printf("不存在\n"); }else{printf("%s\n",ret);//打印出第一个所在的起始位置 }return 0;} 

strstr的模拟实现

#include<stdio.h>
#include<assert.h>
const char * my_strstr(const char* str1,const char* str2)
{assert(str1&&str2);const char* s1=NULL;const char* s2=NULL;const char* cur=str1;if(*str2=='\0'){return str1;//如果str2是一个空字符串,返回str1 }while(*cur!='\0'){s1=cur;s2=str2;while(*s1==*s2&&s1&&s2){s1++;//判断的字符相同则s1,s2,都进行++ s2++;}if(*s2=='\0')//若是s2为\0则返回cur {return cur;}cur++;}} 
int main()
{char arr1[]="abcdefg";char arr2[]="cde";//初始化 const char* ret=my_strstr(arr1,arr2);if(ret==NULL)//进行判断 {printf("不存在\n");}else{printf("%s\n",ret);//打印出第一个所出现的起始位置 }return 0;
}

3,strerror的使用和模拟实现

sterror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

一般是放在errno.h这个头文件中说明的,c语言程序启动的时候就会使用一个全局变量error来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们使用标准库中的函数发生了某种错误,就将会对应的错误码,存放在erron中,strerror函数就可以将错误对应的错误信息字符串的地址返回。

#include<stdio.h>
#include<string.h>
int main()
{int i=0;for(i=0;i<10;i++){pritnf("%s\n",strerror(i));} return 0;} 

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{//打开文件//用r方式打开,表示’读‘以读文件的形式 //打开文件,如果文件不存在,就打开失败FILE*pf=fopen("data.txt","r");if(pf==NULL){printf("打开文件失败\n");} else{printf("打开文件成功\n");fclose(pf);pf=NULL;}return 0;
}

有一个与之相似用法的函数

4,perror

sterror--将错误码对应的错误信息的字符串的起始地址返回

perror--将erron中错误对用的错误信息打印出来

perror打印方式:

函数先打印str指向的字符串,打印:,在打印一个空格,在打印错误码的错误信息。

例如:

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{//打开文件//用r方式打开,表示’读‘以读文件的形式 //打开文件,如果文件不存在,就打开失败FILE*pf=fopen("data.txt","r");if(pf==NULL){printf("打开文件失败,原因是:%s\n",strerror(erron));perror("打开文件失败,原因是"); } else{printf("打开文件成功\n");fclose(pf);pf=NULL;}return 0;
}

就自动补齐冒号和空格,还有错误的原因

//perror也相当于printf+sterror。


http://www.mrgr.cn/news/55117.html

相关文章:

  • leetcode.204.计数质数
  • 数据结构 -- 排序算法
  • 【小白学机器学习19】什么是量化分析(草稿)
  • 提高团队执行力的五大策略
  • uniapp下载在线文档并打开
  • 高等数学 5.5 反常积分的审敛法 Γ函数
  • AIGC实战——世界模型(World Model)
  • MiniConda 的安装与使用
  • 【学术会议投稿】Java Web开发实战:从零到一构建动态网站
  • 【学术会议投稿】机器学习框架终极指南:PyTorch vs TensorFlow vs Keras vs Scikit-learn
  • Anomalib 1.x 系列之二:自定义数据
  • 手动部署Java项目、nginx前端和mysql数据库到centos虚拟机
  • 简单的界面用于控制自动点击器
  • 二叉树算法之 Fenwick 树(Binary Indexed Tree, BIT)详细解读
  • 在Smarty模板中如何用自定义函数
  • C#/.NET/.NET Core技术前沿周刊 | 第 10 期(2024年10.14-10.20)
  • JS数组去重
  • 【算法】小红的ABC
  • 关于region_to_label算子的想法
  • 【深度学习中的注意力机制2】11种主流注意力机制112个创新研究paper+代码——多头注意力机制(Multi-Head Attention, MHA)
  • AG32 MCU家族添加新成员
  • 汽车电子笔记之-014:一场FIFO的思考引发将汽车电子DTC相关 - 故障发生前后关键数据记录并回读的功能浅研发
  • edge浏览器:你的连接不是专用连接
  • Java获取指定目录下的文件名,并自定义排序
  • 关于鸿蒙学习之遇到的问题——ERROR: Invalid dependency entry
  • 神奇的数据结构 —— 跳表