#include<初见c语言之字符函数和字符串函数>

目录

一、字符分类函数

二、字符转换函数

三、strlen的使⽤和模拟实现

1.strlen使用

2.strlen函数的模拟实现 

四、 strcpy的使⽤和模拟实现

1.strcpy使用

2.strcpy函数的模拟实现

五、strcat的使用和模拟实现

1.strcat的使用

2.strcat的模拟实现

六、strcmp的使用和模拟实现

1.strcmp的使⽤

2.strcmp模拟实现

七、strncpy函数的使用

 八、 strncat函数的使用

九、strncmp函数的使用

十、strstr函数使用和模拟实现

1. strstr使用

          2.strstr模拟实现

十一、 strtok函数的使用

十二、  strerror函数的使用

总结


一、字符分类函数

<cctype> (ctype.h) - C++ Reference (cplusplus.com)

可以通过以上这个网站找到相关函数的参数和作用

 islower函数演示

练习:写一个代码,将字符串的小写字母转大写,其他字符不变

代码如下:

#include <stdio.h>

#include <ctype.h>

int main()
{
    char arr[] = "I Am a Student";
    //            I Am a Student\0
    //            0123
    int i = 0;
    while (arr[i] != '\0')
    {
        //之前:if (arr[i] >= 'a' && arr[i] <= 'z')
        //之后:
        if(islower(arr[i]))
        {
            arr[i] -= 32;
        }
        i++;
    }
    printf("%s\n",arr);

    return 0;
}

结果展示:

 


二、字符转换函数

#include <stdio.h>

#include <ctype.h>

int main()
{
    //printf("%c\n", toupper('a'));
    //printf("%c\n", toupper('B'));
    //printf("%c\n", tolower('B'));
    

    char arr[] = "I Am a Student";
    //            I Am a Student\0
    //            0123
    int i = 0;
    while (arr[i] != '\0')
    {
        //之前:if (arr[i] >= 'a' && arr[i] <= 'z')
        //之后:
        //if(islower(arr[i]))
        if(isupper(arr[i]))
        {
            //arr[i] = toupper(arr[i]);
            arr[i] = tolower(arr[i]);
        }
        i++;
    }
    
    printf("%s\n",arr);

    return 0;
}

 运行结果:

 


三、strlen的使⽤和模拟实现

strlen函数:

  • 求字符串的长度,统计的是\0之前的字符个数
  • 字符串中必须有\0
  • strlen的使⽤需要包含头⽂件

1.strlen使用

#include<string.h>
int main()
{
    if ((int)strlen("abc") - (int)strlen("abcdef")>0)
    {
        printf(">\n");
    }
    else
    {
        printf("<=0\n");
    }
    return 0;
}

结果展示:

 

2.strlen函数的模拟实现 

方式1:

//计数器⽅式
int my_strlen(const char * str)
{
        int count = 0;
        assert(str);
        while(*str)
        {
                count++;
                str++;
        }
        return count;
}

方式2:

//计数器⽅式

#include<assert.h>

size_t my_strlen(const char* s)
{
    assert(*s !=NULL);
    int count = 0;
    while (*s != '\0')
    {
        count++;
        s++;
    }
    return count;

方式3:

 //指针-指针的⽅式
int my_strlen(char *s)
{
        assert(str);
        char *p = s;
        while(*p != ‘\0’ )
        p++;
        return p-s;
}

 结果展示:


四、 strcpy的使⽤和模拟实现

strcpy函数:

  • •源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷⻉到⽬标空间。
  • ⽬标空间必须⾜够⼤,以确保能存放源字符串。
  • ⽬标空间必须可修改。

1.strcpy使用

int main()
{
    char arr1[] = "hello bit";
    char arr2[20] = "xxxxxxxxxxxxxxx";
    strcpy(arr2, arr1);

    printf("%s\n", arr2);
    //%s遇到\0不打印
    return 0;
}

结果展示: 

 

2.strcpy函数的模拟实现

char* my_strcpy(char* des, const char* src)
{
    assert(*des != NULL);
    assert(*src != NULL);
    //拷贝\0之前的
    char* ret = des;
    while (*des++ = *src++)
    {
        ;
    }
    return ret;
    //拷贝\0之后的
    *des = *src;
}


int main()
{
    char arr1[] = "hello bit";
    char arr2[20] = "xxxxxxxxxxxxxxx";
    my_strcpy(arr2, arr1);

    printf("%s\n", arr2);
    //%s遇到\0不打印
    return 0;
}

 结果展示:

一趟冒泡排序后,如果 一对没有交换,就说明已经有序了


五、strcat的使用和模拟实现

strcat函数:

  • 源字符串必须以 '\0' 结束。
  • ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
  • ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
  • ⽬标空间必须可修改

1.strcat的使用

int main()
{
    char arr1[20] = "hello ";//hello world
    char arr2[] = "world";
    //char arr2[] = {'w','o','r','l','d'};//err
    //char* s = my_strcat(arr1, arr2);
    //printf("%s\n", arr1);
    //printf("%s\n", s);
    printf("%s\n", strcat(arr1, arr2));

    return 0;
}

结果展示:

2.strcat的模拟实现

#include<string.h>
#include<assert.h>
 char* my_strcat(char* dest, const char* src)
{
     assert(dest && src);
     char* ret = dest;
    //1.找到目标空间的\0
     while (*dest != '\0')
     {
         *dest++;
     }
     //2.拷贝
     while (*dest++ = *src++)
     {
         ;//空语句
     }
     return ret;
}
int main()
{
    char arr1[20] = "hello ";//hello world
    char arr2[] = "world";
    //char arr2[] = {'w','o','r','l','d'};//err
    char* s = my_strcat(arr1, arr2);
    printf("%s\n", arr1);
    printf("%s\n", s);
    printf("%s\n", my_strcat(arr1, arr2));

    return 0;
}

结果展示: 

 


六、strcmp的使用和模拟实现

strcmp函数:

  •  第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
     
  • 第⼀个字符串等于第⼆个字符串,则返回0
     
  • 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

1.strcmp的使⽤

int main()
{
    //char arr1[] = "abcedf";
    //char arr2[] = "abcedf";
    //if (arr1 == arr2)//比较的是地址
    //{

    //}
    //if ("abcedf" == "abcedf")//也比较的是地址,首字符的地址比较
    //{

    //}
    //如果要比较两个字符串的内容,需要使用strcmp
    //int strcmp(const char* str1,const char* str2)
    char arr1[] = "abqedf";
    char arr2[] = "abc";
    int ret = strcmp(arr1, arr2);
    printf("%d\n", ret);
    
    return 0;
}

结果演示:

2.strcmp模拟实现

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1 && str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
            return 0;
        *str1++;
        *str2++;

    }
    return *str1 - *str2;

}
int main()
{
    char arr1[] = "abqedf";
    char arr2[] = "abdf";
    int ret = my_strcmp(arr1, arr2);
    printf("%d\n", ret);
    return 0;
}

结果展示:

 


七、strncpy函数的使用

  • 拷⻉num个字符从源字符串到⽬标空间。
  • 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

int main()
{
    char arr1[] = "abcedf";
    char arr2[20] = {0};
    strncpy(arr2, arr1, 8);

    printf("%s\n", arr2);
}

结果展示:


 八、 strncat函数的使用

 

  •  将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字
  • 如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾。

int main()
{
    char arr1[] = "abcedf";
    char arr2[20] = "xx\0xxxxxxx";
  int len = strlen(arr1);
    strncat(arr2, arr1, len);

    printf("%s\n", arr2);
}

 

结果展示:

 

九、strncmp函数的使用

  • ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

int main()
{
    char arr1[] = "abcedf";
    char arr2[20] = "abq";
    int ret = strncmp(arr1, arr2, 6);

    printf("%d\n", ret);
}

结果展示:

 


十、strstr函数使用和模拟实现

  • 函数返回字符串str2在字符串str1中第⼀次出现的位置。
  • 字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志。

1. strstr使用

int main()
{
    char arr1[] = "this is an apple";
    const char* p = "pl";
    char* ret = strstr(arr1, p);
    if (ret != NULL)
    {
        printf("%s\n", ret);
    }
    else
    {
        printf("找不到");

    }
    return 0;
}

 

结果展示:

 

 2.strstr模拟实现

char* my_strstr(const char* str1, const char* str2)
{
    const char* s1 = NULL;
    const char* s2 = NULL;
    const char* cur = str1;
    if (*str2 == '\0')
    {
        return (char*)str1;
    }
    while (*cur)
    {
        s1 = cur;
        s2 = str2;
        while (*s1!='\0'&& *s2 != '\0'&& * s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            return (char*)cur;
        }
        cur++;
    }
    return NULL;

}

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "bbq";
    char* ret = my_strstr(arr1, arr2);
    if (ret == NULL)
        printf("找不到");
    else
        printf("%s\n", ret);

    return 0;
}

结果展示:

 


十一、 strtok函数的使用

  •  sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
  • 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
  • strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
  • strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改)

int main()
{
    char arr[] = "zpengwei@yeah.net@heheh";
    char arr2[30] = { 0 };//"zpengwei\0yeah\0net"
    strcpy(arr2, arr);
    const char* sep = "@.";
    char* ret = NULL;

    for (ret = strtok(arr2, sep); ret != NULL;ret=strtok(NULL,sep))
    {
        printf("%s\n", ret);
    }


    //ret = strtok(arr2, sep);
    //printf("%s\n", ret);

    //ret = strtok(NULL, sep);
    //printf("%s\n", ret);

    //ret = strtok(NULL, sep);
    //printf("%s\n", ret);

    return 0;
}

 

 结果展示:

十二、  strerror函数的使用

  • strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

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


 

结果展示:

打开文件错误时: 

 

int main()
{
    //fopen以读的形式打开文件的时候,如果文件不存在,就打开失败
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno));
        return 1;
    }
    //读文件

    //关闭文件
    fclose(pf);

    return 0;

}

 


总结

字符函数和字符串函数的使用和模拟实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/519694.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HTML】CSS样式(二)

上一篇我们学习了CSS基本样式和选择器&#xff0c;相信大家对于样式的使用有了初步认知。 本篇我们继续来学习CSS中的扩展选择器及CSS继承性&#xff0c;如何使用这些扩展选择器更好的帮助我们美化页面。 下一篇我们将会学习CSS中常用的属性。 喜欢的 【点赞】【关注】【收藏】…

214基于matlab的交互多模算法(IMM)机动目标跟踪算法

基于matlab的交互多模算法&#xff08;IMM&#xff09;机动目标跟踪算法&#xff0c;完整的15页文档论文。根据二维空间内目标作匀速直线运动和匀速圆周运动的特点&#xff0c;在建立目标运动模型和观测模型的基础上采用基于交互多模算法&#xff08;IMM&#xff09;的卡尔曼滤…

MySQL 50 道查询题汇总,足以巩固大部分查询(附带数据准备SQL、题型分析、演示、50道题的完整SQL)

目录 MySQL 50 道查询题&#xff0c;足以巩固大部分查询数据准备&#xff1a;创建表sql添加表数据sql 50道查询题目汇总01 - 05 题&#xff1a;1、查询 “01” 语文成绩比 “02” 数学成绩高的学生的信息及课程分数2、查询 "01语文课程"比"02数学课程"成绩…

ARM架构学习笔记2-汇编

RISC是精简指令集计算机&#xff08;RISC:Reduced Instruction Set Computing&#xff09; ARM汇编概述 一开始&#xff0c;ARM公司发布两类指令集&#xff1a; ① ARM指令集&#xff0c;这是32位的&#xff0c;每条指令占据32位&#xff0c;高效&#xff0c;但是太占空间 2…

0基础学习Mybatis系列数据库操作框架——自定义类型处理器

大纲 Java模型类定义类型处理器配置文件和类型绑定和字段绑定resultMap中绑定 Mapper代码测试类型对应关系表总结参考资料 我们有时候会在数据库中放入一个扩展字段&#xff0c;用于保存在表设计时尚未考虑到的、未来会加入的一些信息。这个字段我们一般使用字符串存储&#xf…

短视频素材高清无水印购买要多少钱?

大家好&#xff01;在制作短视频时&#xff0c;找到短视频素材高清无水印是非常重要的。那么&#xff0c;短视频素材高清无水印在哪里找呢&#xff1f;今天&#xff0c;我要给大家推荐六个主流的视频素材分享网站&#xff0c;帮助你轻松获取高质量的短视频素材高清无水印&#…

C++读取.bin二进制文件

C读取.bin二进制文件 在C中&#xff0c;可以使用文件输入/输出流来进行二进制文件的读写操作&#xff0c;方便数据的保存和读写。 //C读取bin二进制文件 int read_bin() {std::ifstream file("data_100.bin", std::ios::in | std::ios::binary);if (file) {// 按照…

Hive初始化元数据库(默认是derby数据库)时候出现缺少方法的错误com.google.common.base.Preconditions

错误的出现&#xff1a; 下载好hive后&#xff0c;初始化元数据库&#xff08;使用内置derby数据测试&#xff09;&#xff0c;出现报错 初始化hive元数据&#xff1a;schematool -dbType derby -initSchema 这个原因是与 Hive 和 Hadoop 版本的 Guava 版本不一样导致的。 解决…

SpringBoot+ECharts+Html 字符云/词云案例详解

1. 技术点 SpringBoot、MyBatis、thymeleaf、MySQL、ECharts 等 2. 准备条件 在mysql中创建数据库echartsdb&#xff0c;数据库中创建表t_comment表&#xff0c;表中设置两个字段word与count&#xff0c;添加表中的数据。如&#xff1a;附件中的 echartsdb.sql 3. SpringBoot…

webrtcP2P通话流程

文章目录 webrtcP2P通话流程webrtc多对多 mesh方案webrtc多对多 mcu方案webrtc多对多 sfu方案webrtc案例测试getUserMediagetUserMedia基础示例-打开摄像头getUserMedia canvas - 截图 打开共享屏幕 webrtcP2P通话流程 在这里&#xff0c;stun服务器包括stun服务和turn转发服…

Aurora8b10b(1)IP核介绍并基于IP核进行设计

文章目录 前言一、IP核设置二、基于IP核进行设计2.1、设计框图2.2、aurora_8b10b_0模块2.3、aurora_8b10b_0_CLOCK_MODULE2.4、aurora_8b10b_0_SUPPORT_RESET_LOGIC2.5、aurora8b10b_channel模块2.6、IBUFDS_GTE2模块2.7、aurora_8b10b_0_gt_common_wrapper模块2.8、aurora8b10…

多路转接-epoll/Reactor(2)

epoll 上次说到了poll&#xff0c;它存在效率问题&#xff0c;因此出现了改进的poll----epoll。 目前epoll是公认的效率最高的多路转接的方案。 快速了解epoll接口 epoll_create&#xff1a; 这个参数其实已经被废弃了。 这个值只要大于0就可以了。 这是用来创建一个epoll模…

阿里云服务器资费:一年或1个月费用价格,2024年更新

阿里云服务器资费多少钱&#xff1f;一年或1个月费用价格&#xff1a;2核2G3M轻量服务器61元一年、ECS云服务器2核2G3M 99元一年&#xff0c;2核4G轻量165元一年&#xff0c;2核4G ECS 199元一年&#xff0c;阿里云服务器网aliyunfuwuqi.com整理如下&#xff1a; 1、ECS经济型e…

SpringBoot快速入门笔记(4)

文章目录 一、Vue框架1、前端环境准备2、简介3、快速开始4、事件绑定 二、Vue组件化开发1、NPM2、Vue Cli3、组件化开发4、SayHello自定义组件5、Movie自定义组件 一、Vue框架 1、前端环境准备 编码工具&#xff1a;VSCode 依赖管理&#xff1a;NPM 项目构建&#xff1a;VueCl…

Word·VBA文档合并

目录 1&#xff0c;复制法&#xff0c;不保留原文档格式2&#xff0c;复制法&#xff0c;保留原文档格式3&#xff0c;插入法&#xff0c;保留原文档格式 之前的文章《WordVBA实现邮件合并》虽然可以生成邮件合并文档结果&#xff0c;但是不能像《python实现word邮件合并》一样…

LeetCode-79. 单词搜索【数组 字符串 回溯 矩阵】

LeetCode-79. 单词搜索【数组 字符串 回溯 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;回溯 回溯三部曲。这里比较关键的是给board做标记&#xff0c;防止之后搜索时重复访问。解题思路二&#xff1a;回溯算法 dfs,直接看代码,很容易理解。visited哈希&#xff0c;防止…

Android面试题之Listview篇

秋招在即&#xff0c;计蒙准备在国庆假期结束前整理一套Android初级面试题籍&#xff0c;希望对大家有所帮助 提示&#xff1a;以下是本篇文章正文内容 ListView 1.当 ListView 数据集改变后&#xff0c;如何更新 ListView 使用该 ListView 的 adapter 的 notifyDataSetChange…

记录一下前端定时器清除失效的问题

目录 一、问题引入 二、错误代码&#xff1a; 三、错误原因 四、修正的代码 附 vue提供的线上运行代码网址以便证实可用性 一、问题引入 按理说&#xff0c;打开定时器 xxx setInterval(()>{ },100)&#xff0c;之后只要 clearInterval(xxx) 就可以顺利关闭定时器…

【浅尝C++】继承机制=>虚基表/菱形虚继承/继承的概念、定义/基类与派生类对象赋值转换/派生类的默认成员函数等详解

&#x1f3e0;专栏介绍&#xff1a;浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 &#x1f3af;每日格言&#xff1a;每日努力一点点&#xff0c;技术变化看得见。 文章目录 继承的概念及定义继承的概念继承的定义定义格式继承关系与访问限定符 基类和派生类对象赋值转换继…

如果你正在投简历,一定要试试这款AI工具!

今天给大家分享一款AI简历神器 - BitBitFly AI 简历助手&#xff0c;这个工具可以帮助大家快速、精准投简历&#xff0c;并且提供职位匹配度分析报告&#xff0c;提供专业优化简历建议提高简历和职位匹配度&#xff0c;轻松拿下offer。 如果你在找工作的时候遇到以下问题&…
最新文章