字符串函数介绍&应用(二)

简介: 字符串函数介绍&应用

2.8 strstr函数


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


函数功能:


  • 在str1字符串中查找str2是否存在,存在则返回str2在str1中的起始地址,若不存在则返回空指针。


使用案例:


#include <stdio.h>
#include <string.h>
int main ()
{
    char str[] ="This is a simple string";
    char * pch;
    pch = strstr (str,"simple");
    strncpy (pch,"sample",6);
    puts (str);
    return 0;
}


0f629d306b4cafa14e68a21415ca6d95_70b8a9ae4ed24a13837896c2e7d7f655.png


strstr函数的模拟实现:


char* my_strstr(const char* str1,const char* str2)
{
    if (!*str2)
        return ((char*)str1);
    char* cp = str1;
    char* s1 = str1;
    char* s2 = str2;
    while (*cp)
    {
        s1 = cp;
        s2 = str2;
        while ((*s1 == *s2) && *s2 && *s1)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            return cp;
        }
        cp++;
    }
    return NULL;
}
int main()
{
    char str1[] = "illoveyou";
    char str2[] = "love";
    char* pch;
    pch = my_strstr(str1,str2);
    printf("%s", pch);
    return 0;
}

cp指针用于记录str1字符串中开始匹配的位置,而s1,s2指针负责移动,并且观测所指向的字符是否相同,cp指针的起始位置不能为 '\0',s2字符串匹配到了 '\0'则说明str1中是包含str2字符串的。strstr函数的模拟实现较为复杂,建议小伙伴们自己多模拟几次。


2.9 strtok函数


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


函数功能:sep指向存储分隔符的数组。str是待分割的数组,函数每执行一次,就会将str字符串的一个字符串置为 '\0'并返回第一段字符串的首地址。例如:


int main()
{
  char arr[] = "nihao@world.net";
  char sep[] = "@";
  char* ret = strtok(arr, sep);
  printf("%s", ret);
  return 0;
}

b9bf8aba606ea646fede995c30fb4f38_655195e7c58e4c06ac8971e788a3497e.png


函数要求:


  • sep参数是个字符串,定义了用作分隔符的字符集合。
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。
  • 若strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL 指针。


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


使用案例:


int main()
{
  char arr1[] = "nihao@111#222.333";
  char arr2[20] = { 0 };
  strcpy(arr2, arr1);
  char sep[] = "@.#";
  char* ret = NULL;
  for (ret = strtok(arr2, sep); ret != NULL; ret = strtok(NULL, sep))
  {
  printf("%s\n", ret);
  }
  return 0;
}


image.png


2.10 strerror函数


char * strerror ( int errnum );


strerror函数的参数是一个错误码,函数接收了一个错误码之后会返回一个char*类型的参数,这个参数指向该错误码所对应的错误信息,我们可以通过打印这个函数的返回值来获取具体的错误信息。库函数在调用过程中如果出错了,会将错误码复制给errno这个变量,errno这个变量是C语言自己提供的一个全局变量,专门用于存放库函数的错误码。


我们可以通过strerror函数来查看1-9错误码分别代表哪些错误信息:


int main()
{
  for (int i = 0; i < 10; i++)
  {
  printf("%d:%s\n", i,strerror(i));
  }
  return 0;
}


0faa3c11c601c93dac00e28a5251bd77_0b4233c38f82457c8219d0aaff6cb91a.png


使用案例:例如这里文件如果打开失败了,errno这个变量就会保存文件打开失败所对应的错误码,再通过strerror这个函数将对应的错误信息翻译出来并打印。


int main()
{
  FILE* pFile;
  pFile = fopen("unexist.ent", "r");
  if (pFile == NULL)
  printf("Error opening file unexist.ent: %s\n", strerror(errno));
  return 0;
}


11c4014b50d7ac08e7b299bb977a4ac8_93f7690d30254dcca85fab96bb76168a.png


由上可知,strerror只是返回错误信息字符的首地址,我们想要将其显示在屏幕上还需要调用printf函数,另一个函数可以同时实现这两个功能。那就是perror函数。


perror函数的使用案例:perror函数的参数是一个供打印的字符串,即:perror函数的参数也是会被打印出来的,可以对perror传入提示型的字符串。


int main()
{
  FILE* pFile;
  pFile = fopen("unexist.ent", "r");
  if (pFile == NULL)
  perror("FILE:");
  return 0;
}


e3a6d3e8fc2b2bae717835811310fe03_8e0734942cd145a19fe3539a4ff4dc33.png


3.字符转换函数


常用的字符串函数已经介绍的差不多了。接下来就来看看字符转换函数吧。字符转换函数有两个:


  • int tolower ( int c );//将c所对应的字母转化成小写,原本就是小写则保持不变
  • int toupper ( int c );//将c所对应的字母转化成大写,原本就是大写则保持不变


注意:


  1. 这两个函数的参数必须是字母才有效。
  2. 要包含 ctype.h头文件。


使用案例:


#include <stdio.h>
#include <ctype.h>
int main()
{
  int i = 0;
  char str[] = "Test String.\n";
  char c;
  while (str[i])
  {
  c = str[i]; 
  c = tolower(c);
  putchar(c);
  i++;
  }
  return 0;
}

636e3af0ab606ee0bf7e6d9e05bf4b5a_03b7dabdd3714b91b2f5cdc1c4b057b0.png


4.完结


本章的内容就到这里啦,若有不足,欢迎评论区指正,下期见!


相关文章
|
人工智能 自然语言处理 搜索推荐
全面升级!揭秘阿里云智能Logo设计的AI黑科技
免费体验!阿里云智能logo设计一直致力于用AI技术,帮助更多有设计需求的朋友能“多快好省”地做logo,让“设计logo”这件有门槛的事情,通过智能工具能轻松打造。满意再付款,首单仅需9.9元。
3802 0
全面升级!揭秘阿里云智能Logo设计的AI黑科技
CSV写入文件追加新的内容,文件编码处理
CSV写入文件追加新的内容,文件编码处理
126 8
|
缓存
Flutter Image从网络加载图片刷新、强制重新渲染
Flutter Image从网络加载图片刷新、强制重新渲染
546 1
|
存储 编译器 C语言
【C语言】探索结构体基础知识:简明概要
【C语言】探索结构体基础知识:简明概要
128 1
|
机器学习/深度学习 算法 计算机视觉
深度学习在图像识别中的应用与挑战
深度学习技术在近年来的迅速发展已经彻底改变了图像识别领域。通过构建复杂的神经网络模型,深度学习能够从海量的图像数据中学习到丰富的特征表示,从而实现对图像内容的高度准确识别。本文将深入探讨深度学习在图像识别领域的应用,包括卷积神经网络(CNN)的原理、架构以及优化策略等关键技术点,并分析当前面临的主要挑战和未来的发展趋势。同时,文章还将介绍一些经典的深度学习模型和它们在图像识别任务中的实际应用案例,以期为读者提供一个全面的深度学习在图像识别领域应用的视角。
120 3
|
人工智能 搜索推荐
AI助理小课堂03期
创建组织使用的AI助理 让AI助力企业的每一位员工
|
存储 弹性计算 Kubernetes
Cgroup引发非预期行为——容器12C性能不如8C
背景压测信息:压测工具是jmeter,压测的并发数都是1并发,压测的URL固定。资源信息:ACK集群的ECS是32C, ingress pod 无limit限制, 业务pod采用绑核处理8c或12c链路:客户端 ->  nginx(同VPC下的ECS )-> SLB > ingress pod ->   业务pod  问题客户压测时候, 采用slo-manager对业务p
623 0
Cgroup引发非预期行为——容器12C性能不如8C
|
Web App开发 移动开发 JavaScript
【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
|
SQL Serverless 程序员
准备数据集用于flink学习
准备一百多万的交易数据,作为flink学习过程中的数据集
221 1
准备数据集用于flink学习
|
缓存 编译器 C++
【C++】:string的模拟实现
【C++】:string的模拟实现
87 0