C语言之字符串处理

目录

字符串长度

显示字符串

数字字符的出现次数

大小写字符转换

 字符串数组的参数传递

非字符串的字符数组


目前我们所学习到的是围绕字符串的处理,仅仅是生成字符串、读取并显示字符串,下面我学习更加灵活处理字符串的方式。


字符串长度

我们来看下述语句声明的数组:

char str[6] = "ABC";

元素个数为6的数组保存了元素个数为3的(算上字符串末尾的null字符,则长度为4)的字符串,因此str[4] str[5]都是空的,由此可知字符串不一定正好撑满字符组。

因为字符串含有表示末尾的null字符,所以第一个字符到\0为止的前一个字符就是该字符串的长度,我们可以据此来计算字符串的长度:

#include<stdio.h>/*返回字符串str的长度*/
int str_length(const char s[])
{int len = 0;while(s[len])len++;return len;
}int main()
{char str[128];printf("请输入字符串:");scanf("%s", str);printf("字符串\"%s\"的长度为%d.\n", str, str_length(str));return 0;
}

让我们来分析程序时如何执行的:

1.main函数在调用str_length函数传入的实参str,通过前面的学习可知,实参只有给出数组名称就可以了

2.通过数组的传递,函数str_length所接受的s就是main函数中的str本身

3.在str_length函数中使用变量len,遍历数组使用计算字符串的长度。

4.while语句中表达式正是数组,通过len++是数组下标逐个增加,进而判断数组元素是否为0,即字符串结束的标志“\0”。

下面我们来演示下在遍历过程中使用while语句是如何判断的:


显示字符串

这次我们不使用printf和puts函数,而只使用putchar函数显示字符串:

#include<stdio.h>/*显示字符串s*/
void put_string(const char s[])
{int i = 0;while(s[i])putchar(s[i++]);
}int main()
{char str[128];printf("请输入字符串:");scanf("%s", str);printf("你输入了:");put_string(str);printf("。\n");return 0;
}

在本程序中对字符串中字符进行遍历时使用的while语句对null字符的查找方式一样。


数字字符的出现次数


#include<stdio.h>/*将字符串s出现的数字字符保存在数组cnt中*/
void str_dcount(const char s[], int cnt[])
{int i = 0;while(s[i]){if(s[i]>='0' && s[i]<='9')cnt[s[i] - '0']++;i++;}
}
int main()
{int dcnt[10] = {0};char str[128];int i;printf("请输入字符串:");scanf("%s", str);str_dcount(str, dcnt);puts("字符出现的次数");for(i=0;i<10;i++)printf("'%d' :%d\n", i, dcnt[i]);return 0;
}

大家可能对程序中下面的代码部分有些生疏:

if(s[i]>='0' && s[i]<='9')cnt[s[i] - '0']++;i++;

特别是关于cnt数组,中表达式的运算:任意的字符减去‘0’,都能得到所需要的下标值

大家可以看下面这个文章是关于字符的介绍:https://blog.csdn.net/W06164932/article/details/135150160?spm=1001.2014.3001.5502


大小写字符转换

我们来编写两个函数,一个字符串中所有的字符转换为大写字母,一个全部转换为小写字母

#include<stdio.h>
#include<ctype.h>/*将字符串的字符全部转化为大写*/
void str_toupper(char s[])
{int i = 0;while(s[i]){s[i] = toupper(s[i]);i++;}
}
/*将字符串的字符全部转换为小写*/
void str_tolower(char s[])
{int i = 0;while(s[i]){s[i] = tolower(s[i]);i++;}
}int main()
{char str[128];printf("请输入字符串:");scanf("%s", str);str_toupper(str);printf("大写字母:%s\n", str );str_tolower(str);printf("大写字母:%s\n", str );return 0;
}

我们分别来看下关于toupper函数与tolower函数:

toupper
头文件#include<ctype.h>
原型int toupper(int c);
说明将小写字母转换为大写字母
返回值若c是小写字母,则返回转换后的大写字母,否则之间返回c
tolower
头文件#include<ctype.h>
原型int tolower(int c);
说明将大写字母转换为小写字母
返回值若c是大写应为字母,则返回转换后的小写字母,否则之间返回c

在使用这两个函数遍历字符串过程中,当发现目标字符s[i],会为其赋这些函数的返回值。

如果这两个函数是接受的是英文字母以外的字符,则原封不动的返回这些字符


 字符串数组的参数传递

#include<stdio.h>void put_strary(const char s[][6], int n)
{int i;for(i=0;i<n;i++){printf("s[%d]=\"%s\"\n", i, s[i]);}
}
int main()
{char cs[][6] = {"max", "mike", "HELLO"};put_strary(cs, 3);return 0;
}

在二维数组的形参声明中只有,只有第一维的数组元素数可以省略。


非字符串的字符数组

看如下声明:

char str[4] = {"ABCD'}; 

算上null字符需要5个字符空间,但数组只能接受4个字符,但是像下面这样进行声明,末尾就会不会加上null字符:

char str[4] = {'A', 'B', 'B', 'D'};

这样声明的变量末尾不会加上null字符,我们把它当做4个字符的集合,也就是“普通的数组”

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

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

相关文章

kubeSphere集群部署ElasticSearch

kubeSphere集群部署ElasticSearch 根据docker启动文件来配置修改max_map_count添加配置文件创建工作负载测试 根据docker启动文件来配置 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/us…

设计模式--访问者模式

实验 25&#xff1a;访问者模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解访问者模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用访问者模式法解决实际问题。 [实验任务]&#xff1a;打包员 在我们课堂上…

【新版Hi3536AV100性能果真强悍】

Hi3536AV100是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;智能NVR产品应用开发的新一代专业高端SoC芯片。 Hi3536AV100集成了ARM Cortex-A55八核处理器和性能强大的神经网络处理器&#xff0c;支持多种智能算法应用。 Hi3536AV100支持32路1080p多协议解码及4路…

车队试验的远程实时显示方案

风丘科技推出的数据远程实时显示方案更好地满足了客户对于试验车队远程实时监控的需求&#xff0c;并真正实现了试验车队的远程管理。随着新的数据记录仪软件IPEmotion RT和相应的跨平台显示解决方案的引入&#xff0c;让我们的客户端不仅可在线访问记录器系统状态&#xff0c;…

【Vulnhub 靶场】【Hms?: 1】【简单】【20210728】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hms-1,728/ 靶场下载&#xff1a;https://download.vulnhub.com/hms/niveK.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月28日 文件大小&#xff1a;2.9 GB 靶场作者&#xff1a;niveK 靶场系…

vue3 根据用户权限控制左侧菜单和路由拦截

目录 前言 整体思路 详细开发 1.左侧菜单的显隐控制 2.控制路由权限 补充权限控制 总结 前言 我这里是vue3开发的一个后台管理系统&#xff0c;所以涉及用户权限管理&#xff0c;以及页面权限等&#xff0c;其他模块部分可以查看专栏&#xff0c;这里只对怎么实现根据用…

算法学习系列(十五):最小堆、堆排序

目录 引言一、最小堆概念二、堆排序模板&#xff08;最小堆&#xff09;三、模拟堆 引言 这个堆排序的话&#xff0c;考的还挺多的&#xff0c;主要是构建最小堆&#xff0c;并且在很多情况下某些东西还用得着它来优化&#xff0c;比如说迪杰斯特拉算法可以用最小堆优化&#…

德鲁伊(Druid)链接PGsql前端请求或者后端自动任务频繁出现IOException

尝试在druid配置文件中增加&#xff1a; socket-timeout: 60000 druid一些版本默认会给链接数据库socket默认10s&#xff0c;超出10s之后socket断开&#xff0c;对于GP数据库报的个IO异常。 &#xff08;对于同样的场景mysql超出10s后提示的是socketTimeOut&#xff0c;所以相…

走进电子技术之光敏电阻、电位器、开关

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

系列十四、SpringBoot + JVM参数配置实战调优

一、SpringBoot JVM参数配置实战调优 1.1、概述 前面的系列文章大篇幅的讲述了JVM的内存结构以及各种参数&#xff0c;今天就使用SpringBoot项目实战演示一下&#xff0c;如何进行JVM参数调优&#xff0c;如果没有阅读过前面系列文章的朋友&#xff0c;建议先阅读后再看本篇文…

力扣刷题记录(20)LeetCode:198、213、337

198. 打家劫舍 我们从第一个开始分析&#xff1a; dp[i]:i表示索引&#xff0c;dp表示当前索引可以拿到的最高金额 索引为0时&#xff0c;可以拿到的最高金额为1&#xff1b; 索引为1时&#xff0c;可以拿到的最高金额就是在索引[0,1]之间取&#xff0c;为2 索引为2时&…

使用c语言实现DH秘钥分配算法

使用c语言实现DH秘钥分配算法 DH算法原理 密钥分配 选择一个大素数p&#xff0c; 选择一个整数g(g < p)&#xff1b;通信方A选择一个随机数a&#xff0c;并发送 mod p 给 通信方B&#xff1b;通信方B选择一个随机数b&#xff0c;并发送 mod p 给 通信方A&#xff1b;通信…