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

strtok和strerror函数的认识和使用

一、strtok函数

函数原型: char * strtok(char * str, const char *delim);

strerror函数的使用需要包含头文件<string.h>

功能:

  • 分割字符串:根据delim参数中指定的分隔符,将str字符串拆分为多个子字符串
  • 修改原始字符串:strtok函数会直接在原始字符串中插入’\0’终止符,替换分隔符的位置,因此原始字符串会被修改

参数

  • str:首次调用时传入未分割的字符串;后续调用传入NULL,表示继续分割同一个字符串
  • delim:包含分隔符的字符串,用于定义如何分割原字符串

返回值

  • 成功时返回指向当前字符串的指针
  • 没有更多子字符串时返回NULL

代码演示:

#include<stdio.h>#include<string.h>intmain(){charch[]="192.168.6.111";constchar*sep=".";constchar*str=NULL;charbuf[30]={0};strcpy(buf,ch);str=strtok(buf,sep);printf("%s\n",str);str=strtok(NULL,sep);printf("%s\n",str);return0;}

注意事项:

  • 破坏性:strtok函数会直接修改原字符串,将其中的分隔符替换为’\0’,如果需要保留原字符串,应先拷贝一份
  • 连续分隔符:多个连续的分隔符将会被视为单个分隔符,不会返回空字符串
  • 空指针处理:如果输入的str为NULL且没有前序调用,行为未定义

二、strerror函数

2.1 strerror函数的认识和使用

函数原型:

char* strerror ( int errnum );

strerror函数的使用需要包含头文件<string.h>

功能:

  • strerror函数可以通过参数部分的errnum表示**错误码,**得到对应的错误信息,并且返回这个错误信息字符串的首字符地址
  • strerror函数只针对标准库中的函数发生错误后设置的错误码的转换

参数:

  • errnum:表示错误码
    这个错误码⼀般传递的是 errno 这个变量的值,在C语⾔有⼀个全局的变量叫: errno ,当库函数的调⽤发⽣错误的时候,就会将本次错误的错误码存放在 errno 这个变量中,使⽤这个全局变量需要包含⼀个头⽂件 errno.h 。
  • 返回值:函数通过返回错误码得到错误信息的字符串的首字符地址

代码演示:

//例1:#include<stdio.h>#include<string.h>#include<errno.h>intmain(){for(inti=0;i<=10;i++){printf("%d:%s\n",i,strerror(i));}return0;}

在Windows11+VS2022环境下输出的结果为:

//例2:#include<stdio.h>#include<string.h>#include<errno.h>intmain(){FILE*pFile=NULL;//fopen函数以读的方式打开文件,如果文件不存在,则打开失败pFile=fopen("unexit.ent","r");if(pFile==NULL){printf("错误信息是:%s\n",strerror(errno));return1;//错误返回}return0;}

输出结果:

2.2 perror函数的认识和使用

函数原型:

void perror ( const char * str );

perror函数相当于一次将上述代码中的“printf(“错误信息是:%s\n”, strerror(errno));”完成了,直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印一个冒号和空格,再打印错误信息。

代码演示:

#include<stdio.h>#include<string.h>#include<errno.h>intmain(){FILE*pFile=NULL;//fopen函数以读的方式打开文件,如果文件不存在,则打开失败pFile=fopen("unexit.ent","r");if(pFile==NULL){perror("错误信息是");return1;//错误返回}return0;}

输出结果:


http://www.jsqmd.com/news/754308/

相关文章:

  • CPU高效推理引擎rwkv.cpp:基于RWKV与ggml的本地大模型部署指南
  • 用快马AI十分钟复刻Notepad++:快速构建轻量编辑器原型
  • Node.js 高并发场景下 Promise 并发数量限制怎么实现优化
  • ISAC系统中SIM辅助的约束优化与性能边界分析
  • 轻量级视觉语言模型Shallow-π:边缘计算部署实战
  • NS-USBLoader终极指南:5个核心功能轻松管理任天堂Switch游戏
  • SIMA 2:虚拟智能体的跨场景通用任务执行技术解析
  • YOLOv10-GPS: 基于地理位置约束的实时目标检测系统实现
  • constexpr if + template auto + immediate functions = 新范式?C++27三重组合技破解编译期反射瓶颈(GCC 14.2.0 nightly已支持)
  • 冒险岛游戏资源终极编辑指南:用Harepacker-resurrected打造个性化游戏体验
  • Python PyJWT 验证 token 时怎么防止算法混淆攻击漏洞?
  • ARM SME2指令集:SMLSLL与SMOPA矩阵运算优化解析
  • 终极解密指南:ncmdumpGUI让网易云音乐NCM文件重获播放自由
  • PHP 8.9类型系统重大升级:strict_type_mode支持per-directory配置(.phpini片段),但97%的DevOps尚未启用
  • 超声层析成像法气井放喷两相流相含率测量COMSOL【附代码】
  • 高斯信源与Hopfield网络:信息论与神经网络的联合优化
  • 手把手配置AUTOSAR SecOC FVM:以Davinci Configurator为例,详解多计数器模式
  • Vue开源在线图片海报设计工具网站源码
  • Spring Boot项目实战:5分钟集成EasyCaptcha图形验证码(附完整前后端代码)
  • 智能质量管理
  • Arm SME多向量存储操作指令详解与优化实践
  • YOLOv10-MRA:基于小波域特征分解与重构的多分辨分析目标检测算法
  • LangChain RAG 系统开发全指南
  • 【JVM向量化实战白皮书】:为什么92%的开发者配错-Djdk.incubator.vector.RuntimeFeature?权威配置矩阵首次披露
  • 实战指南:基于快马平台构建《我的世界》高级地图与服务器指令系统
  • 动态误差函数Derf:深度学习归一化新方案
  • OpenClaw系统诊断插件开发:构建Agentic Workflow的一键体检工具
  • SNP分析终极指南:快速提取基因组变异位点的完整工具
  • 5G NR上行失步了怎么办?手把手教你理解PDCCH Order的触发与配置
  • LLaVA-pp视觉语言模型:两阶段训练与指令调优实战解析