C语言 之 strstr函数的使用和模拟、strtok函数的使用、strerror函数和perror函数的使用

news2024/9/21 23:41:23

文章目录

  • strstr 的使用和模拟实现
    • strstr函数模拟实现
  • strtok 函数的使用
    • 例子1
    • 例子2
    • 例子3
  • strerror 函数的使用
    • perror函数

strstr 的使用和模拟实现

函数原型:

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

该函数能够查找str1中第一次出现str2的位置

1.函数返回字符串str2在字符串str1中第⼀次出现的位置
2.字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志

例子:

int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = strstr(str, "simple");
    if (pch != NULL)
    {
        strncpy(pch, "sample", 6);
    }
    puts(str); //输出字符串
    return 0;
}

输出结果:
在这里插入图片描述
我们可以看到,strstr函数能够找到str中第一次出现字符串simple的位置,并且返回指向该字符串第一个字符,即s的地址,接着使用strncpy函数将字符串sample从pch指向的位置开始拷贝将原本的simple改成了sample

strstr函数模拟实现

char* my_strstr(const char* str1, const char* str2)
{
    const char* s1 = NULL;
    const char* s2 = NULL;
    const char* cur = str1;  //这里先用cur存储了str1的起始位置

    if (*str2 == '\0')
    {
        //当str2只有一个'\0'时,就直接返回str1
        return (char*)str1;
    }

    while (*cur)
    {
        s1 = cur;
        s2 = str2;
        while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            //这里就说明匹配成功
            return (char*)cur;
        }
        cur++;  //这里cur++后,再次循环时赋值给s1,让s1从cur的位置开始匹配
    }

    //如果没找到 就返回NULL
    return NULL;
}

int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = my_strstr(str, "simple");
    if (pch != NULL)
    {
        strncpy(pch, "sample", 6);
    }
    puts(str); //输出字符串
    return 0;
}

输出结果:
和上面的结果一样
在这里插入图片描述

strtok 函数的使用

函数原型:

char * strtok ( char * str, const char * delimiters );

该函数能够提取被符号隔开的字符串

1.参数sep指向一个字符串,这个字符串里面你字符是用于分隔符符号的字符集合
2.参数str指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符的标记
3.strtok函数找到str中的标记时,会将其用\0结尾,返回一个指向这个标记的指针(需要注意的是,strtok函数会改变被操作的字符串,所以在使用strtok函数切分字符串时一般使用的是临时拷贝的内容,并且内容可以被修改)
4.若strtok函数的第一个参数不为NULL,函数将找到的是str中第一个标记,strtok函数将保存它在字符串中的位置。
5.若strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
6.如果字符串中不存在更多的标记,将返回NULL指针

例子1

当第一个参数都不为NULL的情况

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "120,50,220,150";
    char* sep = ",";  //分隔符为','
    char* str = NULL;

    str = strtok(arr, sep);
    printf("%s\n", str);

    str = strtok(arr, sep);
    printf("%s\n", str);

    str = strtok(arr, sep);
    printf("%s\n", str);

    return 0;
}

输出结果:
在这里插入图片描述

例子2

第一个参数不为NULL,之后的第一个参数为NULL时,则能顺利达到效果

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "120,50,220,150";
    char* sep = ",";  //分隔符为','
    char* str = NULL;

    str = strtok(arr, sep);
    printf("%s\n", str);

    str = strtok(NULL, sep);
    printf("%s\n", str);

    str = strtok(NULL, sep);
    printf("%s\n", str);

    return 0;
}

输出结果:
在这里插入图片描述

例子3

除了例子2的写法之外,还可以使用for循环来实现

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "120,50,220,150";
    char* sep = ",";  //分隔符为','
    char* str = NULL;

    for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
    {
        printf("%s\n", str);
    }

    return 0;
}

输出结果:
在这里插入图片描述

strerror 函数的使用

函数原型:

char * strerror ( int errnum );

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回,能够知道错误信息,但是需要我们自行打印

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,不同的错误码对应不同的错误信息,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使用⼀个变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

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

int main()
{
	//打印0 - 10这些错误码对于的错误信息
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		printf("%s\n", strerror(i));
	}
	return 0;
}

我们机器的输出结果如下,不同的机器有可能不同:
在这里插入图片描述

举例:

#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));
	}
	return 0;
}

这个代码中有一些错误,变量error也记录了错误码,将其打印就可以知道错误原因。

输出结果:
在这里插入图片描述

perror函数

我们知道上面的函数strerror有一个问题,就是不能够直接自动的打印错误信息,当我们想要直接自动打印错误信息时,我们可以使用perror函数

该函数能够直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息

例子:

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
 FILE * pFile;
 pFile = fopen ("unexist.ent","r");
 if (pFile == NULL)
 perror("Error opening file unexist.ent");  //直接替代了上面例子的打印
 return 0;
}

输出结果:
在这里插入图片描述

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

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

相关文章

产业经济大脑建设方案(五)

为了提升产业经济的智能化水平&#xff0c;我们提出建设一个综合产业经济大脑系统&#xff0c;该系统通过整合大数据分析、人工智能和云计算技术&#xff0c;构建全方位的数据采集、处理和决策支持平台。该平台能够实时监测产业链各环节的数据&#xff0c;运用智能算法进行深度…

Unified 阻抗控制 architecture、framework、approach

Unified 阻抗控制&#xff08;Unified Impedance Control&#xff09;作为一种控制策略&#xff0c;其architecture&#xff08;架构&#xff09;、framework&#xff08;框架&#xff09;和approach&#xff08;方法&#xff09;为&#xff1a; 一、Unified 阻抗控制 Archite…

【MPC】模型预测控制 | 车辆优化控制策略研究与实践

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

CorelDRAW X4重磅发布更新!包含最新安装包下载

CorelDRAW X4是矢量图形制作工具软件&#xff0c;这个图形工具给设计师们提供了矢量动画、页面设计、网站制作、位图编辑和网页动画等多种功能。 X4版本的新特性有活动文本格式&#xff1a;仿效现有段落格式化、使文本能够贴齐格线框&#xff0c;或从边框缩排&#xff0c;从而获…

牛客JS题(四十四)根据包名,在指定空间中创建对象

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 地址引用assign 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><style>/* 填写样式 */</style></head><body><!--…

使用多种机器学习模型进行情感分析

使用 TF-IDF 与贝叶斯分类器进行情感分析是一个常见且有效的组合&#xff0c;特别是在文本分类任务中。贝叶斯分类器&#xff08;通常是朴素贝叶斯分类器&#xff09;等机器学习模型具有计算简单、效率高的优点&#xff0c;且在文本分类任务中表现良好。接下来&#xff0c;我将…

8.16作业

1.思维导图 2.在登录界面的登录取消按钮进行以下设置&#xff1a; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断…

Solidworks二次开发:通过XYZ点的曲线

在SolidWorks中,通过XYZ点创建曲线是一种根据一组点的坐标生成三维曲线的方法。这种方法适用于需要根据特定点集设计曲线的情况,比如在建模复杂几何形状或执行逆向工程时。在SolidWorks中通过XYZ点创建曲线,操作步骤如下 打开SolidWorks并新建文件:启动SolidWorks软件,新建…

开放式耳机哪个品牌好用?盘点四款开放式蓝牙耳机排行榜前十名

作为网易云十级选手&#xff0c;测评过三十多款开放式耳机产品的开放式耳机测评专家来说&#xff0c;如果想要入手一款好用的开放式耳机的话&#xff0c;我会建议从三个方面来考虑&#xff0c;佩戴体验、音质效果和性能配置&#xff0c;了解这三个方面选购款好用的开放式耳机不…

Linux配置JDK8环境变量

目录 一、yum安装1.1 OpenJDK安装1.2 测试是否能够使用1.3 如何卸载JDK 二、手动安装2.1 下载2.2 上传到linux服务器路径2.3 解压2.4 配置环境变量2.5 测试是否能够使用 一、yum安装 1.1 OpenJDK安装 sudo yum install -y java-1.8.0-openjdk-devel1.2 测试是否能够使用 jav…

vue3+高德地图实现,创建和编辑多边形、圆形覆盖物(完整实现)

目录 一、绘制 1.形状选择 2.绘制图形 二、编辑 1.定义所需变量 2.获取需要编辑的覆盖物数据 fenceData并渲染 3.上述监听改动事件↓↓↓ 4.上述监听编辑结束事件 5.鼠标右击结束事件 初始化地图不再赘述,参考这篇文章 vue3中引入高德地图初始化,并添加、删除marke…

MySQL(四)——常用函数

文章目录 函数字符串函数数值函数日期函数流程函数 函数 函数&#xff0c;是指一段可以直接被另一段程序调用的程序或代码。 MySQL中内置了许多函数&#xff0c;我们只需在合适的场景下调用它们即可&#xff0c;调用函数查询结果直接使用SELECT即可&#xff0c;并且可以嵌套使…

电子电气架构---主流主机厂电子电气架构华山论剑(上)

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

递归--数据结构--黑马

递归 总结一句话&#xff0c;上手直接多刷Leetcode&#xff0c;比看这个更有用。 定义 递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集。 例如&#xff0c;单链表递归遍历的例子&#xff1a; void f(Node node) {if (node null) {retu…

class_2:数学运算和注释

1、运算符优先级 2、导入算数库 import matha -1 b -2 c 3 #一元二次方程 delta b ** 2 -4*a*c print((-b math.sqrt(delta))/(2*a)) print((-b - math.sqrt(delta))/(2*a)) 3、注释

KEEPALIVED高可用集群知识大全

目录 一、KEEPALIVED高可用集群简介 1、Keepalived 高可用集群的工作原理 2、Keepalived 高可用集群的作用 二、KEEPALIVED部署 1、网络配置 2、软件安装与启动 3、配置虚拟路由器 4、效果实现 三、启用keepalived日志功能 四、KEEPALIVED的几种工作模式 1、KEEPALI…

【多线程】初步认识Thread类及其应用

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 上篇文章我们简单介绍了什么是进程与线程&#xff0c;以及他们之间的区别与联系&#xff0c;实际应用中还是以多线程编程为主的&#xff0c;所以这篇文章就让我们更加深入地去剖…

深入理解Python range()函数与for循环的完美配合

文末赠免费精品编程资料~~ 今天我们要聊的是一个超级实用且基础的功能组合——range() 函数和 for 循环。无论你是刚开始学习Python&#xff0c;还是已经有点基础&#xff0c;这篇文章都将帮助你更深入地理解和掌握这两个工具。 1. 什么是 range()&#xff1f; range() 是Py…

YOLOV8网络结构|搞懂head

head里面的模块之前在backbone出现过的&#xff0c;有conv和c2f&#xff0c;还有concat是新的&#xff0c;就是用来做连接的&#xff0c;就是把几个通道的输出给连接起来&#xff0c;有C,H,W三个维度的&#xff0c;就看最后连接的参数&#xff0c;是按照哪个方向把他们加起来&a…

【C++从小白到大牛】布隆过滤器

布隆过滤器的提出 布隆过滤器概念 布隆过滤器的原理&#xff1a; 布隆过滤器的运作的总体过程&#xff1a; 布隆过滤器的插入 原码 布隆过滤器的查找 布隆过滤器删除 关于布隆过滤器的面试题&#xff1a; 1. 给两个文件&#xff0c;分别有100亿个query&#xff0c;我们…