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;实验室管理,实验室申请记录,设备管理,设备记录管理,耗材管理,耗材记录管理等功能…

【腾讯云中间件】2023年热门文章集锦

各位读者&#xff0c;大家好&#xff01; 光阴似箭&#xff0c;日月如梭&#xff0c;仿佛冬奥会的盛况还在眼前&#xff0c;新的一年却即将到来。在过去的一年里&#xff0c;我们见证了腾讯云中间件在产品升级与创新方面的显著进步&#xff0c;包括消息队列TDMQ品牌全新升级和…

POJ 1651 Multiplication Puzzle

一、题目 1、题目描述 The multiplication puzzle is played with a row of cards, each containing a single positive integer. During the move player takes one card out of the row and scores the number of points equal to the product of the number on the card ta…

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秒自动发空包保…

kafka 有几种数据保留的策略?

kafka 有几种数据保留的策略&#xff1f; 在 Apache Kafka 中&#xff0c;有几种数据保留策略用于定义消息保存的时长和数据保留的规则。这些策略主要影响 Kafka 中的 Topic。 以下是 Kafka 中常见的数据保留策略&#xff1a; 保留时间策略&#xff08;retention.ms&#xff…

【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;模板使…

1.2 金融数据处理

跳转到根目录&#xff1a;知行合一&#xff1a;投资篇 已完成&#xff1a; 1.1 编程基础   1.1.1 投资-编程基础-numpy   1.1.2 投资-编程基础-pandas 1.2 金融数据处理 文章目录 1. 股市数据获取1.1. 使用qstock获取股票数据1.2. tushare1.3. python爬虫1.4. akshare 2. …

2023.12.28每日一题

LeetCode每日一题 2735.收集巧克力 2735. 收集巧克力 - 力扣&#xff08;LeetCode&#xff09; 介绍 看题目看不懂&#xff0c;在评论区看到一个大哥解释&#xff0c;瞬间明白了。 一张桌子上有n件商品围成一圈&#xff0c;每件都有一个价签&#xff0c;它们构成数组nums。…

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

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

23种设计模式学习

设计模式的分类 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合…

多功能演示工具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…

vue黑马之小兔鲜首页组件案例

素材领取&#xff1a;点我领取素材 提取码&#xff1a;1024 页面开发思路&#xff1a; 1.分析页面&#xff0c;按模块拆分组件&#xff0c;搭架子 (局部或全局注册) 2.根据设计图&#xff0c;编写组件html 结构 css 样式(已准备好) 3.拆分封装通用小组件 (局部或全局注册将来&…

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…