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


    摘要

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

    1 strstr

    1.1 函数使用

    函数原型:

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

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

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    1.2 模拟实现

    实现思路:

    • 使用一个循环遍历 str1 字符串,直到遍历到字符串的 \0 位置。
    • 在每次循环中,比较 s1 和 s2 指向的字符,如果它们相等,则继续比较下一个字符。
    • 如果 s2 指针成功地遍历完 str2 字符串(*s2 == ‘\0’),表示找到了匹配的子字符串,返回 sp 指针,即匹配开始的位置。
    • 如果没有找到匹配,将 sp 指针向前移动一个位置,继续下一轮的比较。
    • 如果遍历完整个 str1 字符串都没有找到匹配,返回 NULL 表示未找到。
    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    2. strtok

    2.1 函数介绍

    函数原型:

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

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

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

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

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

    1. 使用for循环
    #include 
    #include 
    
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    3. strerror

    3.1 函数介绍

    函数原型:

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

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

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

    #include 
    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    3.2 strerror 与 perror

    • strerror是将错误码翻译成错误信息,并返回错误信息字符串的起始地址。
    • 而perror也与处理错误信息有关,该函数默认使用全局变量 errno 中的错误码来查找相应的错误信息,并打印出对应的错误描述
      函数原型:
    void perror(const char *s);
    
    • 1
    • 参数s:自定义的错误消息前缀。
      以下代码,展示了如何使用 perror 函数来打印错误消息:
    #include 
    #include 
    #include 
    
    int main() {
    	FILE *file = fopen("data.txt", "r");
    
    	if (file == NULL)
    	{
    		perror("打开失败");//用户自定义错误信息前缀。
    	}
    	else
    	{
    		// 成功打开文件的操作
    		fclose(file);
    	}
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

  • 相关阅读:
    DC电源模块的使用寿命问题
    Selenium 元素不能定位总结
    如何将MNIST数据集数据图像可视化
    蓝桥杯刷题3
    除镍树脂-HP4020
    RabbitMQ 高级特性
    C. Jumping on Tiles codeforces1729C
    3.事务篇【mysql高级】
    .net core 大文件上传
    如何完美解决 IDE升级后启动报错 Internal error. Please refer to https://jb.gg/ide/critical-startup-errors
  • 原文地址:https://blog.csdn.net/m0_50655389/article/details/133685027