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

本文主要是介绍C语言字符串查找函数和错误信息报告函数(strstr、strtok,strerror),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 摘要
  • 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遍历str1const 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,后续调用传入 NULLfor (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 函数打印错误消息,前缀为 “打开失败”,以便清晰地指示是由于文件打开失败引发的错误。
运行结果:
在这里插入图片描述
至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !
在这里插入图片描述

这篇关于C语言字符串查找函数和错误信息报告函数(strstr、strtok,strerror)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/169627

相关文章

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程