上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

C语言——字符函数和字符串函数(三)【strtok,strerror,perror】

guduadmin371月前

📝前言:

上一篇文章C语言——字符函数和字符串函数(二)对字符函数和字符串函数strstr,strcmp和strncmp进行了一定的讲解

这篇文章主要讲解以下函数的用法:

1,strtok

2,strerror

3,perror

🎬个人简介:努力学习ing

📋个人专栏:C语言入门基础

🎀CSDN主页 愚润求学

🌄每日鸡汤:知不足而奋进,望远山而前行


文章目录

  • 一,strtok的使用
    • 1,strtok初步了解
    • 2,注意事项
    • 3,返回值的不同情况
      • (1)strtok的参数1不为NULL
      • (2)strtok的参数1为NULL
      • (3)字符串中不存在更多标记
      • 二,strerror的使用
      • 三,perror的使用

        一,strtok的使用

        1,strtok初步了解

        我们先来看一下官网对它的介绍👇🏻

        C语言——字符函数和字符串函数(三)【strtok,strerror,perror】,在这里插入图片描述,第1张

        提取出它的函数原型:char * strtok ( char * str, const char * delimiters );

        ①我们先分别理解这里面的参数与返回类型:

        ●参数1:str是需要分割的字符串

        ●参数2:delimiters是用来分割的分割符的集合

        ●返回:返回一个指针(下面会讲解具体的返回情况)

        ②strtok的功能是:根据delimiters里面的分隔字符,把 str分割成不同的标记(这些标记是由分隔符中的任何字符分隔的连续字符序列。)

        可能有点抽象,下面我举个例子:

        比如我们要分割“zhangsan@163.com”这一个字符串

        请看下面的代码👇🏻

        #include
        #include
        int main()
        {
        	char arr[] = "zhangsan@163.com";
        	char str[3] = { '.','@'};
        	printf("%s", strtok(arr, str));
        	return 0;
        }
        

        这里面arr是我们分割的字符串,str是分隔字符的集合

        正常流程就是:用str中的分隔字符,把arr分成:zhangsan,163,com这几个标记

        但是当我们运行,输出结果👇🏻

        C语言——字符函数和字符串函数(三)【strtok,strerror,perror】,在这里插入图片描述,第2张

        (通过这个结果我们可以猜测:printf应该是从z这个首地址开始打印,但是打印完zhangsan就停止了)

        是不是这样呢?(当我们了解了strtok的返回和注意事项就会理解)👇🏻

        2,注意事项

        strtok函数在找到str中的下一个标记的时候,会将标记用‘

        3,返回值的不同情况

        ’结尾(即可能会替换掉这个标记结尾的分隔符)

        请看👇🏻

        C语言——字符函数和字符串函数(三)【strtok,strerror,perror】,在这里插入图片描述,第3张

        显而易见,当这一次strtok被调用后,找到了第一个标记zhangsan,然后把张三后面的@换成了\0

        总之,strtok函数会改变被操作的字符串,因此在我们使用strtok分割字符串时,可以先把字符串拷贝一份,对拷贝的那一份进行操作,这样就不会造成原来的字符串丢失。

        (1)strtok的参数1不为NULL

        在这里返回情况可以分为三类:

        1,strtok的参数1不为NULL

        2,strtok的参数1为NULL

        3,字符串中不存在更多标记

        (2)strtok的参数1为NULL

        这时候函数会找到str中的第一个标记,然后以\0将它结尾,并且记住这个标记结束后的位置,然后返回一个指向这个标记起始位置的指针

        继续看上面用到的例子:

        #include
        #include
        int main()
        {
        	char arr[] = "zhangsan@163.com";
        	char str[3] = { '.','@'};
        	printf("%s", strtok(arr, str));
        	return 0;
        }
        

        C语言——字符函数和字符串函数(三)【strtok,strerror,perror】,在这里插入图片描述,第4张

        在这个例子里,strtok函数返回了zhangsan的起始位置z,随后printf从z位置开始打印,遇到了被strtok修改成的\0于是停止了打印

        (3)字符串中不存在更多标记

        当strtok的参数为NULL时,函数就会从同一个字符串中被保留的位置(即上一个标记结束后的位置)开始,查找下一个标记,当找到标记后,依然是:以\0将这个标记结尾,并且记住这个标记结束后的位置,然后返回一个指向这个标记起始位置的指针

        请看下面的代码,依旧是要实现分割“zhangsan@163.com”这一个字符串👇🏻

        #include
        #include
        int main()
        {
        	char arr[] = "zhangsan@163.com";
        	char str[3] = { '.','@'};
        	char* ptr = NULL; //用ptr接收返回的指针
        	for (ptr = strtok(arr, str); ptr != NULL; ptr = strtok(NULL, str))          
        	{
        		printf("%s\n", ptr); //用ptr接收的地址打印
        	}
        	//用for循环可以实现第一次传入strtok的arr
        	// 然后传入strtok的都是NULL
        	return 0;
        }
        

        输出结果:

        C语言——字符函数和字符串函数(三)【strtok,strerror,perror】,在这里插入图片描述,第5张

        arr的变化:

        C语言——字符函数和字符串函数(三)【strtok,strerror,perror】,在这里插入图片描述,第6张

        第一次strtok返回z的地址,且strtok把@改成\0,ptr接收到了z的地址

        第二次strtok返回1的地址,且把.改成\0,ptr接收了1的地址

        第三次strtok返回c的地址,且把\0改成\0(通俗理解),ptr接收了c的地址

        然后根据ptr这些地址分别打印出了这些标记

        那第四次,com之后找不到标记了呢?👇🏻

        二,strerror的使用

        当字符串中不存在更多标记时,函数就会返回NULL指针,这也就是为什么上面的例子中for循环的进入条件是:ptr != NULL

        三,perror的使用

        头文件:

        strerror是一个传入错误码作为参数,返回参数部分错误码对应的错误信息的字符串地址的函数

        先简单了解什么是错误码:

        C语言程序启动的时候,如果程序出现问题,会返回一个错误码,这个错误码会被记录到errno这个全局变量中

        不同的错误码都对应着不同的错误信息

        使用展示👇🏻

        #include   
        #include   
        #include   
        int main() {
            FILE* file = fopen("nonexistent_file.txt", "r");
            if (file == NULL) {
                printf("Error opening file: %s\n", strerror(errno));
                return 1; // 返回错误码  
            }
            // ...其他代码...  
            fclose(file);
            return 0; // 返回0表示成功  
        }
        

        输出结果:

        C语言——字符函数和字符串函数(三)【strtok,strerror,perror】,在这里插入图片描述,第7张

        在这个例子中,如果文件打开失败,fopen函数会返回NULL,并且errno会记录一个表示具体错误的值。

        我们使用strerror函数就可以得到错误码对应的错误信息的地址,然后打印出来。

        perror函数也是一个用来打印错误码的函数

        通过接受一个字符串作为参数,并把它作为错误消息输出到标准错误流

        同样是上面的代码,我们修改一下,用perror👇🏻

        #include   
        #include   
        #include   
          
        int main() {  
            FILE *file = fopen("nonexistent_file.txt", "r");  
            if (file == NULL) {  
                perror("Error opening file");  
                return 1; // 返回错误码  
            }  
            // ...其他代码...  
            fclose(file);  
            return 0; // 返回0表示成功  
        }
        

        C语言——字符函数和字符串函数(三)【strtok,strerror,perror】,在这里插入图片描述,第8张

        输出结果是完全一样的,perror的不同就在于,它打印完参数部分的字符串后,在打印一个:和一个 (空格),接着打印错误信息。


        🌈我的分享也就到此结束啦🌈

        要是我的分享也能对你的学习起到帮助,那简直是太酷啦!

        若有不足,还请大家多多指正,我们一起学习交流!

        📢公主,王子:点赞👍→收藏⭐→关注🔍

        感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

网友评论

搜索
最新文章
热门文章
热门标签
 
 周易预测运势  2023年运势测算免费  孕妇梦见干尸复活