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

文章目录

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

摘要

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

1 strstr

1.1 函数使用

函数原型:

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

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

以下代码,展示了如何使用 strstr 函数来查找字符串:

c 复制代码
#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 表示未找到。
c 复制代码
#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 函数介绍

函数原型:

c 复制代码
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循环
c 复制代码
#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循环
c 复制代码
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 函数介绍

函数原型:

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

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

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

c 复制代码
#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 中的错误码来查找相应的错误信息,并打印出对应的错误描述
    函数原型:
c 复制代码
void perror(const char *s);
  • 参数s:自定义的错误消息前缀。
    以下代码,展示了如何使用 perror 函数来打印错误消息:
c 复制代码
#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 函数打印错误消息,前缀为 "打开失败",以便清晰地指示是由于文件打开失败引发的错误。

运行结果:

至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。

创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

如果本篇博客有任何错误,请批评指教,不胜感激 !

相关推荐
枫叶丹44 分钟前
【Qt开发】显示类控件(一)-> QLabel
开发语言·qt
Python私教16 分钟前
源滚滚Rust全栈班v1.02 无符号整数详解
开发语言·后端·rust
Brookty19 分钟前
【算法】双指针(二)复写零
学习·算法
yBmZlQzJ32 分钟前
PyQt5 修改标签字体和颜色的程序
开发语言·python·qt
胖达不服输35 分钟前
「日拱一码」081 机器学习——梯度增强特征选择GBFS
人工智能·python·算法·机器学习·梯度增强特征选择·gbfs
初级炼丹师(爱说实话版)1 小时前
2025算法八股——深度学习——优化器小结
人工智能·深度学习·算法
10001hours1 小时前
C语言第12讲
c语言·开发语言
努力的小帅1 小时前
C++_哈希
开发语言·c++·学习·算法·哈希算法·散列表
福赖1 小时前
《MySQL基础——C 语言链接》
c语言·数据库·mysql
Christo32 小时前
TFS-2023《Fuzzy Clustering With Knowledge Extraction and Granulation》
人工智能·算法·机器学习·支持向量机