C语言.字符函数与字符串函数

字符函数与字符串函数

  • 1.字符分类函数
  • 2.字符转换函数
  • 3.[strlen](https://cplusplus.com/reference/cstring/strlen/?kw=strlen) 的使用和模拟实现
  • 4.[strcpy](https://legacy.cplusplus.com/reference/cstring/strcpy/?kw=strcpy) 的使用和模拟实现
  • 5.[strcat](https://legacy.cplusplus.com/reference/cstring/strcat/?kw=strcat) 的使用和模拟实现
  • 6.[strcmp](https://legacy.cplusplus.com/reference/cstring/strcmp/?kw=strcmp) 的使用和模拟实现
  • 7.[strncpy](https://legacy.cplusplus.com/reference/cstring/strncpy/?kw=strncpy) 函数的使用
  • 8.[strncat](https://legacy.cplusplus.com/reference/cstring/strncat/?kw=strncat) 函数的使用
  • 9.[strncmp](https://legacy.cplusplus.com/reference/cstring/strncmp/?kw=strncmp) 函数的使用
  • 10. [strstr](https://legacy.cplusplus.com/reference/cstring/strstr/?kw=strstr) 的使用和模拟实现
  • 11.[strtok](https://legacy.cplusplus.com/reference/cstring/strtok/?kw=strtok) 函数的使用
  • 12.[strerror](https://legacy.cplusplus.com/reference/cstring/strerror/?kw=strerror)函数的使用

1.字符分类函数

C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。
这些函数的使用都需要包含一个头文件是 ctype.h

在这里插入图片描述

这些函数的使用方法非常类似,就那一个来举例,其他非常的类似:

int islower(int c);
  • islower 是能够判断参数部分的 c 是否是小写字母的。

  • 通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回
    0。

练习:

写一个代码,将字符串中的小写字母转大写,其他字符不变。

//方法1
#include <stdio.h>
#include <ctype.h>int main()
{int i = 0;char str[] = "Hello World\n";char c;while (str[i]){c = str[i];if (islower(c))c = c - 32;putchar(c);//HELLO WORLDi++;}return 0;
}

2.字符转换函数

C语言提供了2个字符转换函数:

int tolower(int c)//将参数传进出的大写字母转小写
int toupper(int c)//将参数传进出的小写字母转大写

上面的代码,我们将小写转大写,是 -32 完成的效果,有了转换函数,就可以直接使用 tolower 函数。

//方法2:
#include <stdio.h>
#include <ctype.h>int main()
{int i = 0;char str[] = "Hello World\n";char c;while (str[i]){c = str[i];if (islower(c))c = toupper(c);putchar(c);//HELLO WORLDi++;}return 0;
}

3.strlen 的使用和模拟实现

size_t strlen(const char* str);
  1. 字符串以’\0’作为结束标志,strlen函数返回是在字符串中’\0’前面的字符个数
  2. 参数指向的字符串必须要以’\0’结束
  3. 函数的返回值为size_t,是无符号的
  4. strlen的使用需要包含头文件(string.h)
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1)){printf("str2>str1\n");//str2>str1}else{printf("str2<str1\n");}return 0;
}

strlen的模拟实现:
方法1:

#include <stdio.h>
#include <string.h>
#include <assert.h>//计算器的实现
int my_strlen(const char* str)
{int count = 0;assert(str);while (*str){count++;str++;}return count;
}int main()
{char str[] = "abcdef";int ret = my_strlen(str);printf("%d\n", ret);//6return 0;
}

方法2:

#include <stdio.h>
#include <string.h>
#include <assert.h>//不能创建临时变量计数器,利用递归的方式来解决
int my_strlen(const char* str)
{assert(str);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}int main()
{char str[] = "abcdef";int ret = my_strlen(str);printf("%d\n", ret);//6return 0;
}

方法3:

#include <stdio.h>
#include <string.h>
#include <assert.h>//指针-指针的方式
int my_strlen(const char* str)
{assert(str);char* p = str;while (*p != '\0'){p++;}return p - str;
}int main()
{char str[] = "abcdef";int ret = my_strlen(str);printf("%d\n", ret);//6return 0;
}

4.strcpy 的使用和模拟实现

 char* strcpy(char * destination, const char * source );
  1. Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
  2. 源字符必须以’\0’结束
  3. 会将源字符的’\0’拷贝到目标空间中
  4. 目标空间必须可修改。

strcpy的模拟实现:

#include <stdio.h>
#include <assert.h>
//1.参数的顺序
//2.函数的功能
//3.assert
//4.const修饰指针
//5.函数返回值
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;
}
int main()
{char str1[] = "abcdef";char str2[20] = { 0 };//拷贝:my_strcpy(str2, str1);printf("%s\n", str2);//abcdef//printf(str2);return 0;
}

5.strcat 的使用和模拟实现

  1. Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
  2. 源字符串必须以’\0’结束
  3. 目标字符串中必须也得有\0,否则没办法知道追加从哪开始
  4. 目标空间必须有足够的空间,能够容纳下源字符串的内容
  5. 目标空间必须可修改

模拟实现strcat函数:

#include <stdio.h>
#include <assert.h>char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);//让dest指针走到'\0'位置while (*dest){dest++;}while (*dest++ = *src++){;}return ret;
}
int main()
{char str1[] = "abc";char str2[10] = "cdef";//追加my_strcat(str2, str1);printf(str2);//cdefabcreturn 0;
}

6.strcmp 的使用和模拟实现

  1. 第一个字符串大于二个字符串,则返回大于0的数字
  2. 第一个字符串等于第二个字符串,则返回0
  3. 第一个字符串小于第二个字符串,则返回小于0的数字
  4. 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小

strcmp函数的模拟实现:

#include <stdio.h>
#include <assert.h>int my_strcmp(const char* str2, const char* str1)
{int ret = 0;assert(str1 && str2);//比较while (*str2 == *str1){if (*str1 == '\0')return 0;str1++;str2++;}return *str2 - *str1;
}int main()
{char str1[] = "abcdef";char str2[] = "ace";int ret = my_strcmp(str2, str1);printf("%d\n", ret);//1return 0;
}

7.strncpy 函数的使用

char * strncpy ( char * destination, const char * source, size_t num );
  1. Copies the first num characters of source to destination. If the end of the source C string(which is signaled by a null-character) is found before num characters have been copied,destination is padded with zeros until a total of num characters have been written to it.
  2. 作用:拷贝num个字符串到目标空间中。
  3. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标空间的后面追加0,知道num个。

8.strncat 函数的使用

char* strncat(char* destination, const char* source, size_t num);
  1. Appends the first num characters of source to destination, plus a terminating null-character.(将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加一个 \0 字符)。
  2. If the length of the C string in source is less than num, only the content up to the terminatin null-character is copied.(如果source 指向的字符串的长度小于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾)。
#include <stdio.h>
#include <string.h>int main()
{char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 15);printf("%s\n", str1);return 0;
}

9.strncmp 函数的使用

int strncmp(const char* str1, const char* str2, size_t num);

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

在这里插入图片描述

10. strstr 的使用和模拟实现

  1. Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.(函数返回字符串str2在字符串str1中第一次出现的位置)。
  2. The matching process does not include the terminating null-characters, but it stops there.(字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志)。
#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);printf("%s\n", str);//This is a sample stringreturn 0;
}

strstr的模拟实现

#include <stdio.h>
#include <string.h>char* my_strstr(const char* str1, const char* str2)
{const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;while (*cur){s1 = cur;s2 = str2;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2){s1++;s2++;}//找到了if (*s2 == '\0')return cur;cur++;}//假如cur都走完一遍了,还是没有,就返回NULLreturn NULL;
}int main()
{char str1[] = "hello world";char str2[] = "llo";char* ret = my_strstr(str1, str2);if (ret == NULL)printf("找不到\n");elseprintf("%s\n", ret);return 0;
}

画图分析:
在这里插入图片描述

11.strtok 函数的使用

char * strtok ( char * str, const char * sep);
  1. sep参数指向一个字符串,定义了用作分隔符的字符集合
  2. 第一个参数指定一个字符串,它包含了0个或多个由sep字符串中的一个或者多个分隔符分割的标记。
  3. strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(strtok函数会修改被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  4. strtok函数的第一个参数不为 NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  5. strtok函数的第一个参数为NULL,函数将在同一个字符串被保存的位置开始,查找下一个标记。
  6. 如果字符串中不存在更多的标记,则返回NULL指针。
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "198.650.955.091";char* sep = ".";char* str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}

12.strerror函数的使用

char* strerror(int errnum);

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

在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{int i = 0;for (i = 0; i <= 10; i++){printf("%s\n", strerror(i));}return 0;
}

在Windows11+VS2022环境下输出的结果如下:

No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input / output error
No such device or address
Arg list too long
Exec format error
Bad file descriptor
No child processes

举例:

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

输出:

Error opening file unexist.ent: No such file or directory

也可以了解一下 perror 函数,perror函数相当于一次将上述代码中的第11行完成了,直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息。

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pFile;pFile = fopen("unexist.ent", "r");if (pFile == NULL)perror("Error opening file unexist.ent");return 0;
}

输出:

Error opening file unexist.ent: No such file or directory

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息系统及其技术发展

目录 一、信息系统基本概念 1、信息系统项目开发 2、信息系统项目管理 3、信息系统 Ⅰ、生命周期 Ⅱ、新基建 ①信息基础设施 ②融合基础设施 ③创新基础设施 Ⅲ、工业互联网 Ⅳ、车联网 ①体系框架 ②连接方式 4、习题 二、信息技术发展 1、SDN 2、5G 3、存储…

书生·浦语大模型第二期实战营(5)笔记

大模型部署简介 难点 大模型部署的方法 LMDeploy 实践 安装 studio-conda -t lmdeploy -o pytorch-2.1.2conda activate lmdeploypip install lmdeploy[all]0.3.0模型 ls /root/share/new_models/Shanghai_AI_Laboratory/ln -s /root/share/new_models/Shanghai_AI_Laborato…

只需几步,即可享有笔记小程序

本示例是一个简单的外卖查看店铺点菜的外卖微信小程序&#xff0c;小程序后端服务使用了MemFire Cloud&#xff0c;其中使用到的MemFire Cloud功能包括&#xff1a; 其中使用到的MemFire Cloud功能包括&#xff1a; 云数据库&#xff1a;存储外卖微信小程序所有数据表的信息。…

【linux】软件工具安装 + vim 和 gcc 使用(上)

目录 1. linux 安装软件途径 2. rzsz 命令 3. vim 和 gcc 使用 a. vim的基本概念 b. 命令模式下的指令 c. 底行模式下的指令 1. linux 安装软件途径 源代码安装rpm安装 -- linux安装包yum安装&#xff08;最好&#xff0c;可以解决安装源&#xff0c;安装版本&#xff0…

0418WeCross搭建 + Caliper测试TPS

1. 基本信息 虚拟机名称&#xff1a;Pure-Ununtu18.04 WeCross位置&#xff1a;/root/wecross-demo 2. 搭建并启动WeCross 参考官方指导文档 https://wecross.readthedocs.io/zh-cn/v1.2.0/docs/tutorial/demo/demo.html 访问WeCross网页管理平台 http://localhost:8250/s/…

【Java框架】Spring框架(六)——Spring中的Bean的作用域

目录 Bean的作用域1.singleton(默认)代码示例 2.prototype代码示例 3.request代码示例 4.session代码示例 5.application代码示例 websocket Bean的作用域 Spring支持6个作用域&#xff1a;singleton、prototype、request、session、application、websocket 1.singleton(默认…

python基础知识二(标识符和关键字、输出、输入)

目录 标识符和关键字&#xff1a; 什么是标识符&#xff1f; 1. 标识符 2. 标识符的命名规则 什么是关键字&#xff1f; 1. 关键字 2. 关键字的分类 标识符和关键字的区别&#xff1a; ​​​输出&#xff1a; 1. 普通的输出 2. 格式化输出 格式化操作的目的&#…

Pycharm破解流程

1.下载pycharm 网上很多&#xff0c;随便找一个&#xff0c;懒得找的话&#xff0c;或者去我传上去的资源pycharm部分直接取 2.下载文件 文件部分&#xff0c;我放在pycharm文件里面一起 打开下载好的激活包 3.执行脚本 先执行unisntall-all-users.vbs,直接双击打开&#xff0c…

Springboot AOP接口防刷、防重复提交

Java利用注解、Redis做防重复提交和限流 使用场景 用户网络慢&#xff0c;电脑卡&#xff0c;一直点击保存&#xff0c;修改按钮无返回信息&#xff0c;会导致多个请求去保存、修改 开放接口、或加密接口频繁访问&#xff0c;会导致程序压力大&#xff0c;可能被他人写脚本一直…

Godot3D学习笔记1——界面布局简介

创建完成项目之后可以看到如下界面&#xff1a; Godot引擎也是场景式编程&#xff0c;这里的一个场景相当于一个关卡。 这里我们点击左侧“3D场景”按钮创建一个3D场景&#xff0c;现在在中间的画面中会出现一个球。在左侧节点视图中选中“Node3D”&#xff0c;右键创建子节点…

企业车辆管理系统平台是做什么的?

企业车辆管理系统平台是一种综合性的管理系统&#xff0c;它主要集车辆信息管理、车辆调度、车辆维修、油耗管理、驾驶员管理以及报表分析等多种功能于一体。通过这个平台&#xff0c;企业可以实现对车辆的全面管理&#xff0c;优化车辆使用效率&#xff0c;降低运营成本&#…

在Windows 10中禁用Windows错误报告的4种方法,总有一种适合你

序言 在本文中&#xff0c;我们的主题是如何在Windows 10中禁用Windows错误报告。你知道什么是Windows错误报告吗&#xff1f;事实上&#xff0c;Windows错误报告有助于从用户的计算机收集有关硬件和软件问题的信息&#xff0c;并将这些信息报告给Microsoft。 它将检查任何可…

基于postCSS手写postcss-px-to-vewiport插件实现移动端适配

&#x1f31f;前言 目前前端实现移动端适配方案千千万&#xff0c;眼花缭乱各有有缺&#xff0c;但目前来说postcss-px-to-vewiport是一种非常合适的实现方案&#xff0c;postcss-px-to-vewiport是一个基于postCss开发的插件&#xff0c;其原理就是将项目中的px单位转换为vw(视…

day07 51单片机-18B20温度检测

18B20温度检测 1.1 需求描述 本案例讲解如何从18B20传感器获取温度信息并显示在LCD上。 1.2 硬件设计 1.2.1 硬件原理图 1.2.3 18B20工作原理 可以看到18B20有两根引脚负责供电,一根引脚负责数据交换。18B20就是通过数据线和单片机进行数据交换的。 1)18B20工作时序 2)…

node.js-模块化

定义&#xff1a;CommonJS模块是为Node.js打包Javascript代码的原始方式。Node.js还支持浏览器和其他Javascript运行时使用的ECMAScript模块标准。 在Node.js中&#xff0c;每个文件都被视为一个单独的模块。 概念&#xff1a;项目是由很多个模块文件组成的 好处&#xff1a…

找不到msvcp140dll,无法继续执行代码的详细解决方法

在我们日常使用计算机进行各类工作任务的过程中&#xff0c;时常会遭遇一些突发的技术问题。比如&#xff0c;有时在运行某个重要程序或应用软件时&#xff0c;系统会突然弹出一个令人困扰的错误提示&#xff1a;“电脑提示找不到msvcp140.dll文件&#xff0c;因此无法继续执行…

AI预测福彩3D第9套算法实战化测试第1弹2024年4月22日第1次测试

经过前面多套算法的测试&#xff0c;总结了一些规律&#xff0c;对模型优化了一些参数&#xff0c;比如第8套算法的测试&#xff0c;7码的命中率由最开始的20%提高到了50%。虽然命中率有了很大的提高&#xff0c;但是由于咱们之前的算法只是为了测试和记录&#xff0c;提供的方…

20.Unity飞机大战游戏

1任务&#xff1a;使背景图动起来 2任务&#xff1a;飞机换帧动画 3任务&#xff1a;让飞机发射子弹 4任务&#xff1a;敌机出现 5任务&#xff1a;控制飞机 6任务&#xff1a;游戏碰撞逻辑 7任务&#xff1a;另外两种类型的敌机 8任务&#xff1a;拾取奖励物品换枪 9…

C语言中与内存操作有关的一些函数

前提 最近在使用C语言在开发项目时&#xff0c;要对内存进行操作。刚开始写的时候有一点迷糊&#xff0c;看了一些东西后才发现为什么说指针是C语言的灵魂&#xff0c;因为它可以对内存直接进行操作&#xff0c;多么帅的事情&#xff0c;真的是太帅了。 malloc 声明在头文件…

YOLOv9改进策略 | Conv篇 | 利用 Haar 小波的下采样HWD替换传统下采样(改变YOLO传统的Conv下采样)

一、本文介绍 本文给大家带来的改进机制是Haar 小波的下采样HWD替换传统下采样&#xff08;改变YOLO传统的Conv下采样&#xff09;在小波变换中&#xff0c;Haar小波作为一种基本的小波函数&#xff0c;用于将图像数据分解为多个层次的近似和细节信息&#xff0c;这是一种多分…