C语言字符串查找函数和错误信息报告函数(strstr、strtok,strerror)

news2024/11/25 18:28:26

文章目录

  • 摘要
  • 1 strstr
    • 1.1 函数使用
    • 1.2 模拟实现
  • 2. strtok
    • 2.1 函数介绍
  • 3. strerror
    • 3.1 函数介绍
    • 3.2 strerror 与 perror

摘要

本篇文章介绍了C语言中常用的字符串处理函数,包括字符串查找函数 strstr 和字符串分割函数 strtok,以及错误信息报告函数 strerror。本章将详细说明每个函数的用法、参数和返回值,以及演示了如何使用它们。

1 strstr

1.1 函数使用

函数原型:

const char* strstr ( const char* str1, const char* str2 );
  • str1:要在其中查找的字符串。
  • str2:要查找的目标字符串。

strstr 是C语言中一个用于字符串处理的函数,该函数用于在一个字符串中查找另一个字符串的第一次出现位置。strstr 函数在 str1 字符串中搜索 str2 字符串,并返回第一次找到 str2 的位置(指向 str1 中的字符指针)。如果没找到 str2,则返回 NULL。
以下代码,展示了如何使用 strstr 函数来查找字符串:

#include <stdio.h>
#include <string.h>

int main() 
{
    const char* str1 = "abcdef";
    const char* str2 = "def";
    
    const char* res = strstr(str1, str2);
    
    if (res != NULL) 
    {
        printf("%s\n", res);
    } 
    else 
    {
        printf("在 %s 中未找到 %s\n", str1, str2);
    }
    
    return 0;
}

在上面代码中,strstr 函数查找字符串 “def” 在 “abcdef” 中的位置,并输出找到的位置。如果未找到,则输出未找到的消息。

1.2 模拟实现

实现思路:

  • 使用一个循环遍历 str1 字符串,直到遍历到字符串的 \0 位置。
  • 在每次循环中,比较 s1 和 s2 指向的字符,如果它们相等,则继续比较下一个字符。
  • 如果 s2 指针成功地遍历完 str2 字符串(*s2 == ‘\0’),表示找到了匹配的子字符串,返回 sp 指针,即匹配开始的位置。
  • 如果没有找到匹配,将 sp 指针向前移动一个位置,继续下一轮的比较。
  • 如果遍历完整个 str1 字符串都没有找到匹配,返回 NULL 表示未找到。
#include <stdio.h>
#include <assert.h>

const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);

	const char* s1 = str1;//使用s1遍历str1
	const char* sp = str1;//记录str1中每次开始匹配的位置
	const char* s2 = str2;使用s2遍历str2
	//使用一个循环遍历 str1 字符串,直到遍历到字符串的 \0 位置
	while (*s1)
	{
		//比较 s1 和 s2 指向的字符,如果它们相等,则继续比较下一个字符
		while (*s1 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		//s2 指针成功地遍历完 str2 字符串,表示找到了匹配的子字符串,返回 sp 指针
		if (*s2 == '\0')
		{
			return sp;
		}
		//匹配失败,将 sp 指针向前移动一个位置,继续下一轮的比较
		sp++;
		s1 = sp;
		s2 = str2;
	}
	return NULL;
}
int main()
{
	const char* str1 = "abc";
	const char* str2 = "abcdef";
	
	const char* res = my_strstr(str1, str2);
	
	if (res != NULL)
	{
		printf("%s\n", res);
	}
	else 
	{
		printf("在 %s 中未找到 %s\n", str1, str2);
	}
	return 0;
}

2. strtok

2.1 函数介绍

函数原型:

char* strtok ( char* str, const char* delimiters );
  • str:要分割的字符串,首次调用时传入要分割的字符串,后续调用传入 NULL。
  • delimiters :分隔符字符集合,表示在哪些字符处分割字符串。

strtok 是C语言中一个用于字符串处理的函数,该函数根据指定的分隔符字符将字符串分割成多个子字符串。
strtok工作方式:

  • 第一次调用时,传入要分割的字符串 str 和分隔符字符集合 delimiters 。
  • 函数会在 str 中查找分隔符字符集合中的任何字符,并将第一个子字符串的起始地址返回。
  • 函数会将找到的分隔符字符替换为 \0,从而将原字符串分割成两部分。
  • 后续调用 strtok 时,给第一个参数传NULL时,函数会继续从上一次分割位置的下一个字符开始查找,并返回下一个子字符串的起始地址。
  • 当没有更多子字符串可以分割时,函数返回 NULL,表示结束。

需要注意的是:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。

以下两种方法,分别展示了如何使用 strtok 函数将一个字符串分割成多个子字符串:

  1. 使用for循环
#include <stdio.h>
#include <string.h>

int main() {
	char str[] = "702144246@qq.com";
	const char set[] = "@.";

	 // 第一次调用后续调用传str,后续调用传入 NULL
	for (char* _str = strtok(str, set); _str != NULL; _str = strtok(NULL, set))
	{
		printf("子字符串:%s\n", _str);
	}

	return 0;
}
  1. 使用while循环
int main() {
	char str[] = "702144246@qq.com";//待切割字符串
	const char set[] = "@."; //切割字符集合

	char* _str = strtok(str, s); // 第一次调用
	while (_str != NULL) 
	{
		printf("子字符串:%s\n", _str);
		_str = strtok(NULL, s); // 后续调用,传入 NULL
	}


	return 0;
}

在上面代码中,strtok 函数被用来根据 . 和 @ 分割字符串 “702144246@qq.com”,并将每个子字符串打印出来。strtok 函数在每次调用时都会返回下一个子字符串的指针,直到没有更多子字符串可分割。
运行结果:
在这里插入图片描述

3. strerror

3.1 函数介绍

函数原型:

char* strerror ( int errnum );
  • errnum:表示错误码,通常是由系统调用或库函数返回的错误码。

strerror 是C语言中错误信息报告函数,该函数会根据 errnum 参数返回对应的错误信息字符串。

以下代码,展示了如何使用 strerror 函数来获取错误信息:

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
	FILE *file = fopen("data.txt", "r");

	if (file == NULL) 
	{
		int errnum = errno; // 获取当前的错误码
	
		printf("错误码:%d\n错误信息:%s\n", errnum, strerror(errnum)); // 获取错误信息字符串
	}
	else 
	{
		// 成功打开文件的操作
		fclose(file);
	}

	return 0;
}

在上面代码中,我们试图打开一个不存在的文件,因此 fopen 函数会返回 NULL,并且设置了错误码 errno。然后,我们使用 strerror 函数根据错误码获取相应的错误信息字符串,并打印出了错误消息。

3.2 strerror 与 perror

  • strerror是将错误码翻译成错误信息,并返回错误信息字符串的起始地址。
  • 而perror也与处理错误信息有关,该函数默认使用全局变量 errno 中的错误码来查找相应的错误信息,并打印出对应的错误描述
    函数原型:
void perror(const char *s);
  • 参数s:自定义的错误消息前缀。
    以下代码,展示了如何使用 perror 函数来打印错误消息:
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
	FILE *file = fopen("data.txt", "r");

	if (file == NULL)
	{
		perror("打开失败");//用户自定义错误信息前缀。
	}
	else
	{
		// 成功打开文件的操作
		fclose(file);
	}

	return 0;
}

在上面代码中,我们试图打开一个不存在的文件,因此 fopen 函数返回 NULL 并设置了错误码 errno,该函数默认使用errno 中的错误码来查找相应的错误信息。然后,我们使用 perror 函数打印错误消息,前缀为 “打开失败”,以便清晰地指示是由于文件打开失败引发的错误。
运行结果:
在这里插入图片描述
至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1070970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023旅游产业内容营销洞察报告:如何升级经营模式,适配社媒新链路

2023年我国旅游业强劲复苏&#xff0c;上半年旅游消费增长显著&#xff0c;政府出台一系列文旅扶持政策后&#xff0c;旅游业也在积极寻求数字化转型的升级方式。 上半年以旅游消费为代表的服务业对经济的增长贡献率超过60%&#xff0c;旅游企业普遍实现经营好转&#xff0c;企…

Windows 10下安装运行ROS

Windows 10下安装运行ROS 官方教程 ROS on Windows installation 1 系统要求 Windows ROS需要64位的Windows 10 Desktop或Windows 10 IoT Enterprise。 请确保您已安装Powershell并在系统路径中 从实时病毒扫描程序中排除c:\opt(以及稍后的工作空间文件夹)&#xff0c;因为…

KALI 各种工具的使用与介绍

KALI 各种工具的使用与介绍 一、工具介绍 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关…

Linux CentOS7 yum仓库

在windows下安装一个软件很轻松&#xff0c;只要双击setup或者.exe的文件&#xff0c;安装提示连续“下一步”即可&#xff0c;然而linux系统下安装一个软件似乎并不那么轻松&#xff0c;因为我们不是在图形界面下。 本文我们将讨论如何在linux下安装一个软件。 一、linux软件…

【JavaEE初阶】 Thread类及常见方法

文章目录 &#x1f334;Thread类的概念&#x1f333;Thread 的常见构造方法&#x1f384;Thread 的几个常见属性&#x1f340;start()-启动一个线程&#x1f332;中断一个线程&#x1f6a9;实例一&#x1f6a9;实例二&#x1f6a9;实例三 &#x1f38d;join()-等待一个线程&…

如何选择UMLChina服务

服务口号&#xff1a;聚焦最后一公里 斐力庇第斯从马拉松跑回雅典报信&#xff0c;虽然已是满身血迹、精疲力尽&#xff0c;但他知道&#xff1a;没有出现在雅典人民面前&#xff0c;前面的路程都是白费。 学到的知识如果不能最终【用】于您自己的项目之中&#xff0c;也同样是…

设备搭建(waf、蜜罐、ids和ips)

文章目录 防火墙waf网闸蜜罐idsips 防火墙 DMZ区域叫非军事化区减&#xff0c;DMZ有web服务或者MySQL服务&#xff0c;从互联网到dmz的流量一般不拦截&#xff08;因为需要互联网用户访问web服务&#xff09;&#xff0c;如果dmz沦陷&#xff0c;攻击者想要继续横向移动到内网…

系统03:15min导图复习 文件管理

&#x1f433;前言 图源&#xff1a;文心一格 考研笔记整理&#xff0c;纯复习向&#xff0c;思维导图基本就是全部内容了&#xff0c;不会涉及较深的知识点~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画思维导图~&#x1f9e9;&#x1f9e9; 编辑&#xff1a; …

layui laydate实现日期选择并禁用指定的时间

最终实现禁用2023-9-26这天的效果 官网地址 日期和时间组件文档 - layui.laydate 下面是实现的代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet"…

IPSG技术和IP组播

1&#xff0c;IPSG技术概述 实验&#xff1a; DHCP snooping IPSG 拓扑&#xff1a; 需求&#xff1a; 1&#xff0c;实现PC1 和PC2 动态获取IP地址 2, 在SW2 配置DHCP snooping 实现DHCP 服务器的安全 3, 在 连接PC 1 和 PC2 的 接口上 做IPSG &#xff0c;防止终端…

AWD训练赛QWQ

使用D盾啥都没扫到&#xff0c;河马倒是扫了挺多东西&#xff0c;但是代码审计能力太差&#xff0c;不怎么看得懂 一般这里我们如果扫到那种很明显的一句话木马&#xff0c;直接删掉&#xff0c;爆出对手IP后尝试利用 代码审计能力不好&#xff0c;只能从网站页面入手 是一个登…

集合的基本运算

集合的运算等式&#xff1a; 常用的集合运算不等式&#xff1a; 、 试题 A&#xff0c;B&#xff0c;C是集合&#xff0c;证明&#xff1a;(A-B)-CA-(B∪C) 【答案】 设A、B、C是集合&#xff0c;证明 (A∪B)-C(A-C)∪(B-C)。 【答案】 已知A{1,2,3}&#xff0c;A-B{1,2}&…

【观察】天翼云政务大模型“慧泽”:推动政务服务再升级,加速智慧城市再进化...

进入2023年以来&#xff0c;AIGC的爆发式增长推动了全球步入一个全新时代——大模型时代&#xff0c;它不仅引发了AI产业的整体升级换代&#xff0c;同时大模型与行业和应用场景的深度融合&#xff0c;更加速了AI的“走深向实”。 其中&#xff0c;政务业务不仅是连接政府、企业…

FinClip PC 终端支持更新,现已兼容抖音与支付宝小程序

产品方面的相关动向 FinClip 全新升级&#xff01;现已兼容抖音小程序与支付宝小程序 自从 FinClip Studio 上线后&#xff0c;我们收到很多开发者对于“支持兼容抖音小程序与支付宝小程序”的需求反馈&#xff0c;现在 FinClip Studio 对抖音小程序和支付宝小程序的全面支持…

槽道流CFD结果与理论解对比

目录 理论CFD验证code 理论 理论参考文献 对于槽道流&#xff0c;理论上近壁面时均速度为线性分布&#xff0c;远离壁面处为对数分布 在对数区&#xff0c;有两个未知参数&#xff0c;两个人标定了不同的两组数据。 可以看出还是有一定区别的。 CFD验证 CFD有两组数据&…

2023年陕西省安全员B证证模拟考试题库及陕西省安全员B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年陕西省安全员B证证模拟考试题库及陕西省安全员B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;陕西省安全员B证证模拟考试题库是根据陕西省安全员B证最新版教材&#xff0c;陕西省安全员B证大纲整理…

一文掌握项目经理面试难题及其回答要点【干货收藏】

大家好&#xff0c;我是老原。 转眼就来到了10月&#xff0c;金九银十&#xff0c;想着你可能面试用得上&#xff0c;就又准备了一份2023最新版。 在看面试题之前&#xff0c;你要了解&#xff0c;面试题的本质到底是考察你什么&#xff0c;再根据这个大原则&#xff0c;收集面…

ai智能机器人要怎么运营更好

运营机器人核心关注的只有两个点&#xff0c;一个是机器人话术库的关键词是否充足&#xff0c;二是对录音的高要求。每一个话术&#xff0c;都把它当成一个重要的项目来做。比如做需求调研&#xff0c;学习客户的行业知识&#xff0c;了解他们这个行业打电话的语气语调。其它的…

爱普生L125X_L325X系列打印机Wi-Fi配置方法(Smart Panel)

准备工作&#xff1a; 手机需要下载“Epson Smart Panel”APP&#xff1b; 配置无线&#xff08;Wi-Fi&#xff09;方法 说明&#xff1a;SSID名称&#xff08;Wi-Fi名&#xff09;不能包含中文字符,路由器需要选择2.4GHz频段; 1. 打开“Epson Smart Panel”软件&#xff0…

vue3飞书扫码登录网页

二维码 SDK 接入文档 飞书官方文档链接 https://open.feishu.cn/document/common-capabilities/sso/web-application-sso/qr-sdk-documentation 最后更新于 2023-08-08 概述 为了实现网页接入飞书授权登录工作&#xff0c;将飞书登录的二维码嵌入到网页中。当用户扫码成功后…