【C语言】字符串操作总结

目录

前言

1.字符串逆序输出

(1)不改变输入的字符串

(2)改变输入的字符串

2.求字符串长度的函数strlen

3.字符串拷贝函数strcpy

4.字符串连接函数strcat

5.字符串比较函数strcmp

6.strncpy(p, p1, n) 复制指定长度字符串  

7.strncat(p, p1, n) 附加指定长度字符串

8.strcasecmp忽略大小写比较字符串

9.strncmp(p, p1, n) 比较指定长度字符串

10.strchr(p, c) 在字符串中查找指定字符

11.strstr(p, p1) 查找字符串 

12.isalpha() 检查是否为字母字符

13.isupper() 检查是否为大写字母字符

14.islower() 检查是否为小写字母字符

15.isdigit() 检查是否为数字


前言

总结了常用字符串函数操作和C语言字符串函数的实现


1.字符串逆序输出

(1)不改变输入的字符串

#include <stdio.h>
#include <string.h>#define N 20int main(int argc, char *argv[])
{char arr[N]; // 使用N初始化数组大小int i, n;printf("Please input a string:");fgets(arr, sizeof(arr), stdin); // 更安全的方式获取输入,使用fgets()函数n = strlen(arr); for (i = n-1; i >= 0; i--)putchar(arr[i]);putchar('\n');return 0;
}

 

(2)改变输入的字符串

#include <stdio.h>
#include <string.h>#define N 20int main(int argc, char *argv[])
{char arr[N] = {0};int i, j, n, ch;printf("Please input a string:");fgets(arr, sizeof(arr), stdin); // 使用fgets安全地获取输入,指定最大读取字符数为数组大小n = strlen(arr);i = 0;j = n-1;while (i < j) {ch = arr[i];arr[i] = arr[j];arr[j] = ch;i++;j--;}fputs(arr, stdout); // 使用fputs输出字符串,不会自动添加换行符return 0;
}

2.求字符串长度的函数strlen

size_t strlen(const char *str);
参数 str 是要计算长度的字符串,返回值是该字符串的长度。

格式:strlen(字符数组)

功能:计算字符串长度

返值:返回字符串实际长度,不包括‘\0’在内

\xhh表示十六进制数代表的符号

\ddd表示8进制的

例:对于以下字符串,strlen(s)的值为:

char  s[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};

char  s[ ]=“\t\v\\\0will\n”;

char  s[ ]=“\x69\141\n”; 答案:1   3   3

函数实现思路:

#include <stddef.h> // 为了使用 size_t 类型size_t strlen(const char *str) 
{size_t length = 0; // 初始化字符串长度为 0// 循环直到遇到字符串的结尾while (*str != '\0') {length++; // 每遍历一个字符,长度加一str++;    // 指针向后移动到下一个字符}return length; // 返回字符串长度
}

 

3.字符串拷贝函数strcpy

char *strcpy(char *dest, const char *src);

 参数 dest 是目标字符串,src 是源字符串。该函数将 src 中的内容复制到 dest 中,并返回 dest

格式:strcpy(字符数组1,字符串2)

功能:将字符串2,拷贝到字符数组1中去

返值:返回字符数组1的首地址

说明: 字符数组1必须足够大 ,拷贝时‘\0’一同拷贝 

函数实现思路

char *strcpy(char *dest, const char *src) 
{char *p = dest; // 保存目标字符串的起始地址// 将源字符串的每个字符复制到目标字符串中,直到遇到源字符串的结尾while (*src != '\0'){*dest = *src; // 将源字符串的字符复制到目标字符串中dest++;       // 指针移动到下一个目标字符串的位置src++;        // 源字符串的指针也移动到下一个字符}*dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'return p; // 返回目标字符串的起始地址
}

 

4.字符串连接函数strcat

char *strcat(char *dest, const char *src);

 参数 dest 是目标字符串,src 是要连接的字符串。该函数将 src 中的内容连接到 dest 的末尾,并返回 dest

格式:strcat(字符数组1,字符数组2)

功能:把字符数组2连到字符数组1后面

返值:返回字符数组1的首地址

说明: 字符数组1必须足够大 以容纳原始字符串的内容和新的字符串内容

连接前,两串均以‘\0’结束;

连接后,串1的‘\0’取消,新串最后加‘\0’

函数实现思路:

char *strcat(char *dest, const char *src) 
{char *p = dest; // 保存目标字符串的起始地址// 移动指针到目标字符串的结尾while (*dest != '\0') {dest++;}// 将源字符串的内容复制到目标字符串的末尾while (*src != '\0') {*dest = *src; // 将源字符串的字符复制到目标字符串的末尾dest++;       // 指针移动到下一个目标字符串的位置src++;        // 源字符串的指针也移动到下一个字符}*dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'return p; // 返回目标字符串的起始地址
}

 

5.字符串比较函数strcmp

int strcmp(const char *str1, const char *str2);

参数 str1str2 是要比较的两个字符串。如果两个字符串相等,返回值为 0;如果 str1 按字典顺序小于 str2,则返回值小于 0;如果 str1 按字典顺序大于 str2,则返回值大于 0。

格       式:strcmp(字符串1,字符串2)

功       能:比较两个字符串   比较规则:对两串从左向右逐个字符比较                      

                (ASCII码),直到遇到不同字符或‘\0’为止                                          

返       值:返回int型整数

        a. 若字符串1< 字符串2, 返回负整数

        b. 若字符串1> 字符串2, 返回正整数

        c. 若字符串1== 字符串2, 返回零 

函数实现: 

int strcmp(const char *str1, const char *str2) 
{while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2) {str1++;str2++;}return (*str1 - *str2); // 返回字符串比较结果
}

 

6.strncpy(p, p1, n) 复制指定长度字符串  

strncpy 函数用于将源字符串的指定长度复制到目标字符串中。如果源字符串的长度小于指定长度,则在复制完源字符串后,目标字符串的剩余空间将用空字符填充。 

char *strncpy(char *dest, const char *src, size_t n);

参数 dest 是目标字符串,src 是源字符串,n 是要复制的字符数。

 函数实现:

#include <stddef.h> // 为了使用 size_t 类型// 将源字符串的内容复制到目标字符串,最多复制 n 个字符
char *strncpy(char *dest, const char *src, size_t n) 
{char *p = dest; // 保存目标字符串的起始地址// 拷贝源字符串的内容到目标字符串,直到达到指定的字符数或者遇到源字符串的结尾while (n > 0 && *src != '\0') {*dest++ = *src++; // 将源字符串的字符复制到目标字符串中n--;}//如果源字符串的长度小于指定长度,则在复制完源字符串后,目标字符串的剩余空间将用空字符填充。 while (n > 0) {*dest++ = '\0'; }return p; // 返回目标字符串的起始地址
}

7.strncat(p, p1, n) 附加指定长度字符串

strncat 函数用于将源字符串的指定长度附加到目标字符串的末尾。

char *strncat(char *dest, const char *src, size_t n);

参数 dest 是目标字符串,src 是源字符串,n 是要附加的字符数。

函数实现:

char *strncat(char *dest, const char *src, size_t n) 
{char *p = dest; // 保存目标字符串的起始地址// 移动指针到目标字符串的结尾while (*dest != '\0') {dest++;}// 将源字符串的内容复制到目标字符串的末尾,最多复制 n 个字符while (n > 0 && *src != '\0') {*dest++ = *src++; // 将源字符串的字符复制到目标字符串的末尾n--;}*dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'return p; // 返回目标字符串的起始地址
}

 

8.strcasecmp忽略大小写比较字符串

strcasecmp 函数用于比较两个字符串,忽略大小写。其原型为:

int strcasecmp(const char *str1, const char *str2);

参数 str1str2 是要比较的两个字符串。如果两个字符串相等(不区分大小写),返回值为 0;否则返回非 0 值。

函数实现:

#include <ctype.h> // 为了使用 tolower 函数int strcasecmp(const char *str1, const char *str2) 
{while (*str1 != '\0' && *str2 != '\0' && tolower(*str1) == tolower(*str2)) {str1++;str2++;}return (tolower(*str1) - tolower(*str2)); // 返回字符串比较结果
}

 

9.strncmp(p, p1, n) 比较指定长度字符串

strncmp 函数用于比较两个字符串的前n个字符。其原型为:

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

参数 str1str2 是要比较的两个字符串,n 是要比较的字符数。如果两个字符串的前n个字符相等,返回值为 0;否则返回非 0 值。

函数实现:

#include <stddef.h> // 为了使用 size_t 类型int strncmp(const char *str1, const char *str2, size_t n) 
{while (n > 0 && *str1 != '\0' && *str2 != '\0' && *str1 == *str2) {str1++;str2++;n--;}if (n == 0) {return 0; // 前 n 个字符相等} else {return (*str1 - *str2); // 返回字符串比较结果}
}

 

10.strchr(p, c) 在字符串中查找指定字符

strchr 函数在字符串中查找指定字符,并返回第一个匹配到的字符的指针。其原型为:

char *strchr(const char *str, int c);

参数 str 是要搜索的字符串,c 是要查找的字符。如果找到了指定字符,则返回该字符在字符串中的地址;否则返回 NULL。

 函数实现:

char *strchr(const char *str, int c) 
{while (*str != '\0') {if (*str == c) {return (char *)str; // 返回指定字符在字符串中的位置}str++;}return NULL; // 没有找到指定字符,返回 NULL
}

11.strstr(p, p1) 查找字符串 

strstr 函数在字符串中查找指定子字符串,并返回第一个匹配到的子字符串的指针。其原型为:

char *strstr(const char *haystack, const char *needle);

参数 haystack 是要搜索的字符串,needle 是要查找的子字符串。如果找到了指定的子字符串,则返回该子字符串在字符串中的地址;否则返回 NULL。

函数实现:

char *strstr(const char *haystack, const char *needle) 
{while (*haystack != '\0') {const char *h = haystack;const char *n = needle;// 在 haystack 中查找与 needle 第一个字符匹配的位置while (*h != '\0' && *n != '\0' && *h == *n) {h++;n++;}// 如果找到了 needle,则返回其在 haystack 中的位置if (*n == '\0') {return (char *)haystack;}// 否则,继续搜索下一个字符haystack++;}// 如果 haystack 中不存在 needle,则返回 NULLreturn NULL;
}

 

12.isalpha() 检查是否为字母字符

isalpha 函数用于检查一个字符是否为字母字符(即 A-Z 或 a-z)。其原型为:

int isalpha(int c);

如果 c 是一个字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int isalpha(int c) 
{return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}

 

13.isupper() 检查是否为大写字母字符

isupper 函数用于检查一个字符是否为大写字母字符(即 A-Z)。其原型为:

int isupper(int c);

如果 c 是一个大写字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int isupper(int c) 
{return (c >= 'A' && c <= 'Z');
}

 

14.islower() 检查是否为小写字母字符

islower 函数用于检查一个字符是否为小写字母字符(即 a-z)。其原型为:

int islower(int c);

如果 c 是一个小写字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int islower(int c) 
{return (c >= 'a' && c <= 'z');
}

 

15.isdigit() 检查是否为数字

isdigit 函数用于检查一个字符是否为数字字符(即 0-9)。其原型为:

int isdigit(int c);

如果 c 是一个数字字符,则返回非零值(即真);否则返回 0。

函数实现:

int isdigit(int c) 
{return (c >= '0' && c <= '9');
}

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

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

相关文章

【Python基础】进程

文章目录 [toc]程序与进程的区别与联系同步任务示例 并行任务示例进程调度的“随机性” 进程属性与方法process_object.start()方法process_object.join()方法process_object.daemon属性没有设置守护进程的情况设置守护进程的情况 process_object.current_process()方法 进程通…

数仓开发:DIM层数据处理

一、了解DIM层 这个就是数仓开发的分层架构 我们现在是在DIM层&#xff0c;从ods表中数据进行加工处理&#xff0c;导入到dwd层&#xff0c;但是记住我们依然是在DIM层&#xff0c;而非是上面的ODS和DWD层。 二、处理维度表数据 ①先确认hive的配置 -- 开启动态分区方案 -- …

c++:优先级队列(priority queue)使用及底层详解,附带仿函数初步使用

文章目录 优先级队列的使用大堆小堆**注意** 优先级队列的模拟实现pushpopsizeemptytop 仿函数仿函数是什么pushpop 仿函数结合优先级队列的优势 优先级队列的使用 优先级队列本质是就是完全二叉树,是个堆.我们可以用优先级队列来取出一段序列中的前N个最大值. priority_queue…

Postman的一些使用技巧

Postman 是一个流行的 API 开发工具&#xff0c;用于设计、开发、测试、发布和监控 API。在现代web开发中使用非常广泛。后端开发必备而且必会的工具。 目录 1.配置环境变量 2.动态变量 3.脚本 4.测试 5.模拟 6.监控 7.集合运行器 8.响应保存 9.请求历史 10.同步请求…

嵌入式Linux编辑器vi

一、vi是什么 vi是Linux系统的第一个全屏幕交互式编辑工具。 vi与vim vi 和 vim 是 Linux 和 Unix 系统上非常流行的文本编辑器。尽管 vi 是最初的版本&#xff0c;但 vim&#xff08;Vi IMproved&#xff09;是它的一个增强版本&#xff0c;提供了更多的功能和易用性。 vi 是一…

使用ESP8266连接EMQX完成数据上传

国庆期间在家里窝着哪里也没去&#xff0c;到处都是人。打算自己捣鼓点小玩意&#xff0c;相信大家对STM32ESP8266ONENET这种组合已经见怪不怪了&#xff0c;这次不走寻常路&#xff0c;咱们搞点不一样的。正巧自己也一直有做一套网关系统的想法&#xff0c;因此就有了下面这篇…

【论文阅读笔记】关于“二进制函数相似性检测”的调研(Security 22)

个人博客链接 注&#xff1a;部分内容参考自GPT生成的内容 [Security 22] 关于”二进制函数相似性检测“的调研&#xff08;个人阅读笔记&#xff09; 论文&#xff1a;《How Machine Learning Is Solving the Binary Function Similarity Problem》&#xff08;Usenix Securi…

算法提高之背包问题背包问题求具体方案

算法提高之背包问题背包问题求具体方案 核心思想&#xff1a;01背包 dp输出方案 因为求字典序最小的方案 所以当取第i个物品时 下一步要求的就是i1 ~ n的最大方案 所以f意义改变 变成了第i个元素到最后一个元素总容量为j的最优解 之前是前i个物品总容量为j的最优解 这样在之…

[AIGC] MVCC 是怎么实现的

InnoDB 实现的MVCC&#xff0c;是通过 ReadView Undo Log 实现的&#xff0c;Undo Log 保存了历史快照&#xff0c;ReadView可见性规则帮助判断当前版本的数据是否可见。 具体操作时&#xff1a; SELECT InnoDB会根据以下两个条件检查每行记录&#xff1a; a. InnoDB只查找版本…

leetCode71. 简化路径

leetCode71. 简化路径 代码 // 化简&#xff1a;就是把所有的., .. // 去掉弄成进入想进的目录&#xff0c;且结果最后不能有/ // 实现思路&#xff1a; 本质上是一个栈&#xff0c;就是进栈出栈的一个模拟实现 class Solution { public:string simplifyPath(string path) {//…

面试算法-链表-反转链表(golang、c++)

目录 1、题目 2、解题思路 2.1 遍历、迭代 2.2 递归 3、源代码 3.1 c 3.2 golang 4、复杂度分析 4.1 遍历、迭代法 4.2 迭代法 1、题目 链表是一种常用的数据结构&#xff0c;链表的特点是插入、删除节点的效率非常高&#xff0c;因为他不需要移动其他任何元素&…

Linux——守护进程化(独立于用户会话的进程)

目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前&#xff0c;我们学习过socket编程中的udp通信与tcp通信&#xff0c;但是当时我们服务器启动的时候&#xff0c;都是以前台进程的方式启动的&#xff0c;这样很不优雅&#xff0c…

数据分析:基于DESeq2的转录组功能富集分析

介绍 DESeq2常用于识别差异基因&#xff0c;它主要使用了标准化因子标准化数据&#xff0c;再根据广义线性模型判别组间差异&#xff08;组间残差是否显著判断&#xff09;。在获取差异基因结果后&#xff0c;我们可以进行下一步的富集分析&#xff0c;常用方法有基于在线网站…

银行智能化数据安全分类分级实践分享

文章目录 前言一、数据安全智能分类分级平台建设背景二、数据安全分类分级建设思路和实践1、做标签– 数据安全标签体系2、打标签– 鹰眼智能打标平台 3.03、用标签– 全行统一“数据安全打标签结果”服务提供前言 随着国家对数据安全的高度重视,以及相关法律法规的出台,数据…

python数据分析中数据可视化简单入门

1.折线图表 首先引入相关包pyecharts&#xff0c;如果没下载可以先下载 pip install pyecharts from pyecharts.charts import Lineline Line() # 添加x轴 line.add_xaxis([呱了个呱,羊村,牟多,蜂地,喵帕斯]) # 添加y轴 line.add_yaxis("GDP",[50,30,40,34,63,22])…

01 JVM --

JVM (Java Virtual Machine) 是一个虚拟机HotSpot 是 JVM 概念的一个实现。HotSpot 虚拟机通过即时编译 (JIT) 技术将 Java 字节码转换为本地机器码&#xff0c;以提高程序的执行效率。OpenJDK 是一个项目名&#xff0c;它在 HotSpot 的基础上开发了 HotSpot 的开源实现方法区是…

Redhat Linux忘记密码解决方案

1、重启系统 2、将光标移动到要启动的内核 3、按e编辑当前条目 4、将光标移动以Linux开头的行&#xff0c;此为内核命令行 5、在末尾添加人的rd.break 6、按ctrlx继续启动&#xff0c;如果发现输入的rd.break不能进入到伪系统&#xff0c;那么改为 rd.break consoletty0 (按ctr…

设计模式-03 设计模式-工厂模式factory-内部工厂

设计模式-03 设计模式-工厂模式factory-内部工厂 目录 设计模式-03 设计模式-工厂模式factory-内部工厂 1.定义 2.内涵 3.案例对比 4.特点 4.总结 1.定义 内部工厂模式是一种创建类对象的方式&#xff0c;其中工厂方法被封装在类内部&#xff0c;客户端只能通过类的公共…

epoll的LT和ET模式介绍

目录 1.epoll的LT和ET模式介绍 2.epoll的ET模式如何处理 2.1 epoll的ET模式编程读取数据的处理方式 2.2 将描述符设置为非阻塞模式的方法 3.ET模式的总结 4.epoll的LT模式和ET模式总结 5.IO复用总结 1.epoll的LT和ET模式介绍 epoll对文件描述符有两种操作模式: LT(Leve…

Linux(openEuler、CentOS8)常用的IP修改方式(文本配置工具nmtui+配置文件+nmcli命令)

----本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS类似&#xff0c;可参考本文&#xff09;---- 一、知识点 &#xff08;一&#xff09;文本配置工具nmtui(openEuler已预装) nmtui&#xff08;NetworkManager Text User Interface&#xff09;是一…