C语言字符串知识点和算法总结

目录

一、字符串遍历

1、字符串和字符数组

2、获取字符串长度

3、字符串遍历

4、大小写转换

5、字符串数组

二、字符串拷贝

三、字符串比较

四、字符串分割

五、字符串翻转

1、题目详解

2、算法详解

3、源码剖析

六、回文串

1、定义

2、例题讲解

3、算法详解

4、源码剖析


一、字符串遍历

1、字符串和字符数组

  「 字符串 」 是一种特殊的 字符数组,字符数组需要有一个长度字段来表示这个数组中的元素个数。而字符串不需要,字符串一定是以\0结尾的,在 C语言中,字符串的表示如下:

char c[6] = "Hello";                         // (1)
char d[5] = { 'H', 'e', 'l', 'l', 'o' };     // (2)

  其中 (1) 表示字符串,它虽然只有五个字符,但是需要有一个结尾字符\0(它的 ASCII 码值为 0)进行占位,所以字符串长度为 5,但是实际需要 6 个字节的存储空间。
  而 (2) 代表的是一个数组,它的每个元素是一个字符,理解成一个长度为 5 的数组即可。

2、获取字符串长度

  在C语言中,可以通过strlen函数,获取一个字符串的长度,例如以下这段代码的输出结果为 5:

char c[6] = "Hello"; 
printf("%d\n", strlen(c));

3、字符串遍历

  字符串的遍历类似数组遍历,不同的是结束条件的判定上。可以利用获取字符串长度这个方法,确定数组的大小,然后进行结束判定,如下:

    int len = strlen(s);for(i = 0; i < len; ++i) {// TODO ...}

  也可以通过对每个字符进行判断,如果不等于\0则继续进行遍历,如下:

    for(i = 0; s[i] != '\0'; ++i) {// TODO ...}

  又由于\0的 ASCII 码值为 0,所以又可以写成如下形式:

    for(i = 0; s[i]; ++i) {// TODO ...}

4、大小写转换

  首先,我们可以利用 ASCII 码值的关系比较来确定它是大写字母,还是小写字母,如果是大写字母转成小写字母,可以通过先减去A再加上a,从而转换成小写字母。实现如下:

    if(s[i] >= 'A' && s[i] <= 'Z') {s[i] = s[i] - 'A' + 'a';}

5、字符串数组

  字符串数组其实可以理解成二维数组的概念,访问也是一样,用[]进行解引用,对于二维数组char **a,要访问第 i 个字符串的第 j 个字符,可以利用a[i][j]来访问。

二、字符串拷贝

  字符串拷贝是字符串操作中非常常用的手段,即将一个字符串赋值给另一个字符串,在C语言中,调用的系统函数为strcpy。实现如下:

char src[10] = "Hello";
char tar[10];
strcpy(tar, src);

  这个函数调用完毕,字符串tar的值就变成了"Hello"

三、字符串比较

  同样常用的,还有字符串比较,在C语言中,调用的系统函数为strcmp。简单实现如下:

char src[10] = "Hello";
char tar[10] = "hello";
int x = strcmp(tar, src);
int y = strcmp(tar, "hello");

  以上语句调用完毕后,由于 C语言是大小写敏感的,所以 x 的值 非零 表示字符串比较不相等,而 y 的值 为零 表示字符串比较相等。

四、字符串分割

  概念比较简单,所谓 字符串分割,就是将一个带空格(或者其它指定的分割符)的字符串分割成一个个单独的(不包含分割符的)字符串。如图所示:

  用C语言来表示,分割前是一个字符串:

char str[9] = "I love U";

  分割后就会变成一个字符串数组:

char str[][5] = {"I", "love", "U"
};

五、字符串翻转

  字符串反转,其实就是第 00 个字符和最后一个字符交换,第 11 个字符和倒数第二个字符交换,以此类推,第 i 个字符 和 第 n−i−1 个字符交换。

1、题目详解

  给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。元音字母包括 'a''e''i''o''u',且可能以大小写两种形式出现。

2、算法详解

  定义两个指针 i 和 j,i 从头开始扫描,j 从尾开始扫描,如果两者都是元音的情况下,执行一次交换操作,否则 i 不断自增,j 不断自减,直到两者重合为止。

3、源码剖析

char vowels[] = "aeiouAEIOU";bool isVowel(char c) {             // (1)int i;for(i = 0; vowels[i]; ++i) {if(vowels[i] == c) {return true;}}    return false;
}void swap(char *a, char *b) {       // (2)char tmp = *a;*a = *b;*b = tmp;
}char * reverseVowels(char * s){int i = 0, j = strlen(s)-1;     // (3)while(i < j) {while(s[i] && !isVowel(s[i]))++i;                    // (4)while(j >= 0 && !isVowel(s[j]))--j;                    // (5)if(i >= j) break;           // (6)swap( &s[i], &s[j] );       // (7)++i, --j;                   // (8)}return s;}
  • (1) 实现一个函数,判断一个字符是否是元音;
  • (2) 实现一个函数,交换两个字符;
  • (3) 定义两个指针:i 和 j;
  • (4) 如果 i 对应的字符不是元音,则自增 i;
  • (5) 如果 j 对应的字符不是元音,则自减 j;
  • (6) 如果 i≥j,则说明没必要再进行交换,退出循环;
  • (7) 否则,交换 i 和 j 对应的字符;
  • (8) i 和 j 两个指针继续往中间逼近;

六、回文串

1、定义

  回文串就是指一个串,顺序读和逆序读结果是一样的,例如:"aba"和 "abccba"都是回文串。判断一个字符串是不是回文串,我们只要比较它的第一个元素和最后一个元素是否相等,第二个元素和倒数第二个元素是否相等,以此类推。

2、例题讲解

  给定一个字符串 s ,验证 s 是否是回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。

3、算法详解

  根据题意,先把字母和数字以外的字符剔除,并且将大写字母全部转换为小写字母,然后进行回文判定即可。

4、源码剖析

char *filter(char *s) {                          // (1)int i;char *ret = (char *) malloc( sizeof(char) * (strlen(s)+1) );int retSize = 0;for(i = 0; s[i]; ++i) {if(s[i] >= 'a' && s[i] <= 'z') {ret[retSize++] = s[i];               // (2)}else if(s[i] >= 'A' && s[i] <= 'Z') {ret[retSize++] = s[i] - 'A' + 'a';   // (3)}else if(s[i] >= '0' && s[i] <= '9') {ret[retSize++] = s[i];               // (4)}}ret[retSize] = '\0';    return ret;
}bool judgePalindrome(char *s) {                  // (5)int i;int len = strlen(s);for(i = 0; i < len/2; ++i) {if(s[i] != s[len-1-i]) {return false;}}return true;
}bool isPalindrome(char * s){int i;char *t = filter(s);bool ret = judgePalindrome(t);free(t);return ret;
}
  • (1) 实现剔除接口,返回一个字符串的首地址,把字母和数字以外的字符剔除,并且将大写字母全部转换为小写字母;
  • (2) 小写字母保留;
  • (3) 大写字母转换为小写字母;
  • (4) 数字保留;
  • (5) 回文字符串判定;

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

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

相关文章

SSM实验室设备管理----计算机毕业设计

项目介绍 本项目为后台管理系统&#xff0c;分为管理员、老师、学生三种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 信息管理&#xff1a;用户管理&#xff1b; 基础管理&#xff1a;实验室管理,实验室申请记录,设备管理,设备记录管理,耗材管理,耗材记录管理等功能…

ClickHouse基础知识(五):ClickHouse的SQL 操作

基本上来说传统关系型数据库&#xff08;以 MySQL 为例&#xff09;的 SQL 语句&#xff0c;ClickHouse 基本都支持&#xff0c; 这里不会从头讲解 SQL 语法只介绍 ClickHouse 与标准 SQL&#xff08;MySQL&#xff09;不一致的地方。 1. Insert 基本与标准 SQL&#xff08;My…

windTerm 连接一段时间之后自动断开

默认是关闭会话空闲保活功能的&#xff0c;如所连接的SSH服务没做连接保活&#xff0c; 就很可能超时自动断开 开启会话保活 在 会话 -> 首选项 -> Default Session Settings -> SSH -> 连接 -> 发送空包以保持会话活动 设置15&#xff0c;即15秒自动发空包保…

【JAVA核心知识】分布式事务框架Seata

Seata 基本信息 GitHub&#xff1a;https://github.com/seata/seatastars: 20.6k 最新版本&#xff1a; v1.6.1 Dec 22, 2022 官方文档&#xff1a;http://seata.io/zh-cn/index.html 注意 官方仅仅支持同步调用。 官方在FAQ中表示对于异步框架需要自行支持。 具体的扩展思…

2012年第一届数学建模国际赛小美赛B题大规模灭绝尚未到来解题全过程文档及程序

2012年第一届数学建模国际赛小美赛 B题 大规模灭绝尚未到来 原题再现&#xff1a; 亚马逊是地球上现存最大的雨林&#xff0c;比地球上任何地方都有更多的野生动物。它位于南美洲大陆的北侧&#xff0c;共有9个国家&#xff1a;巴西、玻利维亚、厄瓜多尔、秘鲁、哥伦比亚、委…

C# ASP.NET 实验室 检验中心 医疗LIS源码

LIS系统能够自动处理大量的医学数据&#xff0c;包括样本采集、样本处理、检测分析、报告生成等。它能够快速、准确地进行化验检测&#xff0c;提高医院的运营效率。LIS系统还提供了丰富的数据分析功能&#xff0c;能够对医院化验室的业务流程进行全面、细致的监控。 LIS系统优…

年终回顾与展望:CSDN成就之路,2023年AI浪潮展望及2024 Flag

文章目录 2023年在CSDN获得的肯定1&#xff0c;入围2023博客之星2&#xff0c;《有哪些让你目瞪口呆的Bug&#xff1f;》征文获得TOP33&#xff0c;通过创作者身份认证4&#xff0c;多篇文章被城市开发者社区收录5&#xff0c;多篇文章进入全站综合热榜6&#xff0c;积极参与社…

060:vue中markdown编辑器mavon-editor的应用示例

第060个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

磁盘管理 :逻辑卷、磁盘配额

一 LVM可操作的对象&#xff1a;①完成的磁盘 ②完整的分区 PV 物理卷 VG 卷组 LV 逻辑卷 二 LVM逻辑卷管理的命令 三 建立LVM逻辑卷管理 虚拟设置-->一致下一步就行-->确认 echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- -…

多功能演示工具ProVideoPlayer2 mac特色介绍

ProVideoPlayer2 mac是用于大多数任何生产的首选多功能演示工具。ProVideoPlayer 2是一种动态视频播放和处理媒体服务器&#xff0c;可将视频映射&#xff08;包括播放和实时视频输入&#xff09;实时控制到一个或多个输出。包括实时效果&#xff0c;调度&#xff0c;网络同步和…

【笔试强训】Day1_贪心算法_组队竞赛

题目链接&#xff1a;牛客_组队竞赛 目录 题目解析 代码书写 知识补充 题目解析 题目让我们求所有队伍的水平值总和最大 由题可得&#xff1a; 队伍的水平值等于该队伍队员中第二高水平值; 随机给定3*n个数&#xff0c;需要自己组队并且得出队伍水平最大值&#xff1b; 我…

geemap学习笔记037:分析地理空间数据--坐标格网和渔网

前言 坐标格网&#xff08;Coordinate Grid&#xff09;简称“坐标网”&#xff0c;是按一定纵横坐标间距&#xff0c;在地图上划分的格网&#xff0c;坐标网是任何地图上不可缺少的要素之一。下面将详细介绍一下坐标格网和渔网。 1 导入库并显示地图 import ee import geem…

react 之 美团案例

1.案例展示 2.环境搭建 克隆项目到本地&#xff08;内置了基础静态组件和模版&#xff09; git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务&#xff08;内置了json-server&#xff09; npm run serve 启动前端服务 npm…

零代码也能玩出花:Mugeda在H5设计中的魔法力量

文章目录 一、Mugeda零代码可视化H5设计工具简介二、Mugeda零代码可视化H5设计实战案例1. 注册并登录Mugeda账号2. 选择模板3. 编辑页面内容4. 添加动画效果5. 预览和发布 三、Mugeda零代码可视化H5设计的优势《Mugeda零代码可视化H5设计实战》内容简介作者简介目录前言/序言 随…

Docker本地部署开源浏览器Firefox并远程访问进行测试

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

Windows环境检验NodeJs安装是否成功

Windows环境检验NodeJs安装是否成功 检验方法 1、winR 打开运行窗口&#xff0c;在此窗口输入cmd命令 2、进入命令提示符窗口&#xff0c;分别输入以下命令&#xff0c;显示版本号&#xff0c;则安装成功 node -v&#xff1a;显示安装的nodejs版本npm -v&#xff1a;显示安装…

Lunix的奇妙冒险————权限篇

文章目录 一.什么是权限二.用户权限和类别。1.用户2.角色3.更换文件角色 三.文件的类别和对应权限1.文件的类别。2.文件属性权限1.权限说明。2.默认生成文件权限来源3.更改权限 3.文件的执行与删除 四.不同用户共同在一个目录下的权限。1.普通用户家目录2.在同一目录下文件的权…

LabVIEW的便携式车辆振动测试分析

随着计算机和软件技术的发展&#xff0c;虚拟仪器正逐渐成为机械工业测试领域的主流。在现代机械工程中&#xff0c;特别是车辆振动测试&#xff0c;传统的测试方法不仅设备繁杂、成本高昂&#xff0c;而且操作复杂。为解决这些问题&#xff0c;开发了一款基于美国国家仪器公司…

【新版Hi3559AV100 旗舰8K30 AI摄像机芯片】

新版Hi3559AV100 旗舰8K30 AI摄像机芯片 一、总体介绍 Hi3559AV100是专业的8K Ultra-HD Camera SOC&#xff0c;它提供了8K30/4K120广播级图像质量的数字视频录制&#xff0c;支持8路Sensor输入&#xff0c;支持H.265编码输出或影视级的RAW数据输出&#xff0c;并集成高性能ISP…

proE各版本安装指南

下载链接 https://pan.baidu.com/s/1BSaJxvPPGeIa4YKm7xk57g?pwd0531 1.鼠标右击【Proe5.0M280(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Proe5.0M280(64bit)】&#xff08;解压的路径中不能有中文&#xff09;。 2.打开…