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

embedded/2024/9/23 7:20:57/

目录

前言

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.ppmy.cn/embedded/33510.html

相关文章

【JavaEE 初阶(一)】初识线程

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.进程3.线程4.线程和进程的区别5.Thread创建线程5.1继承Thread创建线程5.2实现R…

2024五一赛数学建模A题B题C题完整思路+数据代码+参考论文

A题 钢板最优切割路径问题 &#xff08;完整资料在文末获取&#xff09; 1. 建立坐标系和表示方法&#xff1a; 在建模之前&#xff0c;我们需要将切割布局转换为数学表示。首先&#xff0c;我们可以将布局中的每个点表示为二维坐标系中的一个点。例如&#xff0c;B1可以表示…

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

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

神经网络参数初始化

一、引入 在深度学习和机器学习的世界中&#xff0c;神经网络是构建智能系统的重要基石&#xff0c;参数初始化是神经网络训练过程中的一个重要步骤。在构建神经网络时&#xff0c;我们需要为权重和偏置等参数赋予初始值。对于偏置&#xff0c;通常可以将其初始化为0或者较小的…

Vue的项目启动指令分析

通过Vue CLI脚手架创建的项目&#xff0c;默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中&#xff0c;找到package.json 双击打开&#xff0c;找到scripts部分 在scripts部分&#xff0c;有一个"serve"键值对&#xff0c;这里的…

Linux专栏09:Linux基本指令之时间日期指令及关机重启指令

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章题目 编号&#xff1a;09 文章目录 文章题目六、时间相关指令1…

通义灵码实战系列:一个新项目如何快速启动,如何维护遗留系统代码库?

作者&#xff1a;别象 进入 2024 年&#xff0c;AI 热度持续上升&#xff0c;翻阅科技区的文章&#xff0c;AI 可谓是军书十二卷&#xff0c;卷卷有爷名。而麦肯锡最近的研究报告显示&#xff0c;软件工程是 AI 影响最大的领域之一&#xff0c;AI 已经成为了软件工程的必选项&…

探索AI工具的巅峰:个人体验与深度剖析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…