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个字符的集合,也就是“普通的数组”

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringBoot+vue+elementui的校园文具商城系统详细设计和实现

基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现前言介绍&#xff1a;系统设计&#xff1a;系统开发流程用户登录流程系统操作流程 功能…

jenkins+mvn使用自定义jdk

jenkins2.357开始已经全面放弃jdk1.8从而使用openjdk11,但是项目一般都是用的比较老的java环境打包构建 一. 配置java环境(此方式测试有问题) 1.1 新增不同jdk配置和路径 1.2 新增后项目选择对应java8 1.3 构建命令 1.4 打包构建失败 原因在build阶段多了 mvn命令导致去掉就…

掌握激活函数(一):深度学习的成功之源

文章目录 引言基本概念常用激活函数举例Sigmoid激活函数公式Sigmoid函数的数学特性示例基于NumPy和PyTorch实现Sigmoid函数将Sigmoid函数应用于二分类任务 Sigmoid激活函数的局限性举例 ReLU激活函数公式ReLU函数的数学特性ReLU函数的特点示例基于NumPy和PyTorch实现ReLU函数搭…

C语言——数据在内存中的存储【整型数据在内存中的储存,大小端字节序储存,浮点型数据在内存中的储存】

&#x1f4dd;前言&#xff1a; 在前面的三篇文章中我们已经完成了对字符函数和字符串函数的学习&#xff0c;现在就让我们探索新领域&#xff0c;更加深入的理解**数据在内存中的存储方式**&#xff1a; 1&#xff0c;整数在内存中的存储 2&#xff0c;⼤⼩端字节序存储 3&…

GitOps实践指南:GitOps能为我们带来什么?

Git&#xff0c;作为开发过程中的核心工具&#xff0c;提供了强大的版本控制功能。即便在写代码的时候稍微手抖一下&#xff0c;我们也能通过 Git 的差异对比&#xff08;diff&#xff09;轻松追踪到庞大工程中的问题&#xff0c;确保代码的准确与可靠。这种无与伦比的自省能力…

FreeRTOS中断、临界区和任务调度器

一、中断 中断是 CPU 的一种常见特性&#xff0c;中断一般由硬件产生&#xff0c;当中断发生后&#xff0c;会中断 CPU 当前正 在执行的程序而跳转到中断对应的服务程序种去执行&#xff0c;ARM Cortex-M 内核的 MCU 具有一个 用于中断管理的嵌套向量中断控制器NVIC。ARM Cort…

【数据库】为什么要分库分表

为什么要分库分表 1.为什么要分库分表&#xff1f;2.垂直拆分3.水平拆分4.总结4.1 逻辑库和物理库4.2 逻辑表和物理表 1.为什么要分库分表&#xff1f; 随着近些年信息化大跃进&#xff0c;各行各业无纸化办公产生了大量的数据&#xff0c;而越来越多的数据存入了数据库中。当…

Vue 问题解决

一、问题&#xff1a;TypeError: (0 , _message.default) is not a function 当没有default时,在其他页面import引入的时&#xff0c;必须加{}。 二、问题&#xff1a;Vue前端页面的表格数据总是一行一行的显示 使用Async/Await来解决前端数据一行一行显示的问题。可以将获取部…

python 实现粒子群算法(带绘制)

本文章用python实现了粒子群算法&#xff0c; 标准PSO的算法流程如下&#xff1a; 初始化一群微粒&#xff08;群体规模为m&#xff09;&#xff0c;包括随机的位置和速度&#xff1b;评价每个微粒的适应度&#xff1b;对每个微粒&#xff0c;将它的适应值和它经历过的最好位…

众和策略股市行情分析:股票开户后什么时候能交易?

股票开户后什么时候能生意&#xff1f; 股票开户后不才一生意日便能正常展开生意操作&#xff0c;包含申报股票生意及非生意事务。假设投资者是周五或接近节假期时结束的开户&#xff0c;就要不才周一或假期结束后才华进行生意。 当然&#xff0c;假设投资者注册的是一些特别…

BDD - Python Behave 配置文件 behave.ini

BDD - Python Behave 配置文件 behave.ini 引言behave.ini配置参数的类型配置项 behave.ini 应用feature 文件step 文件创建 behave.ini执行 Behave 引言 前面文章 《BDD - Python Behave Runner Script》就是为了每次执行 Behave 时不用手动敲一长串选项&#xff0c;其实还有…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学&#xff0c;老兵易用 4.1 右尖括号>的改进 在 C98 中&#xff0c;有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >&#xff0c;那么它们之间需要一个空格来进行分隔&#xff0c;以避免发生编译时的错误。C98 会将>&g…

【量化】蜘蛛网策略复现

文章目录 蜘蛛网策略研报概述持仓数据整理三大商品交易所的数据统一筛选共有会员清洗数据计算研报要求数据全部代码 策略结果分析无参数策略有参数策略正做反做 MSD技术指标化 蜘蛛网策略 策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为…

腾讯云轻量应用服务器详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、4核8G12M带宽646元15个月等&#xf…

Linux操作系统:LVM与磁盘配额

目录 一、LVM逻辑卷管理基础 1、LVM逻辑卷管理的概念 2、LVM逻辑卷管理的核心组件 3、LVM逻辑卷管理的优势 4、LVM逻辑卷管理的命令 4.1 扫描命令的用法 4.1.1 pvscan 4.1.2 vgscan 4.1.3 lvscan 4.2 查看命令的用法 4.2.1 pvdisplay 4.2.2 vgdisplay 4.2.3 lvdis…

12.27_黑马数据结构与算法笔记Java(补2)

目录 279 0-1 背包问题 动态规划 实现 280 0-1 背包问题 动态规划 降维 281 完全背包问题 动态规划 分析 282 完全背包问题 动态规划 实现 283 零钱兑换问题 动态规划 分析 284 零钱兑换问题 动态规划 实现 285 零钱兑换问题 动态规划 降维 286 零钱兑换II 动态规划 分析…

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上&#xff0c;此问题概率性小&#xff0c;操作上面不小心打了断点… 应该是打断点的时候&#xff0c;打到了方法上面&#xff0c;去掉哟 Java Method Breakpoints

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

「从红月开始」运输公司遭精神污染,小十七救哥哥,事发地陷危机

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《从红月开始》第3集超前爆料&#xff0c;本次透露陆辛首次被派遣去调查精神污染的任务。他的目的地是四方运输公司&#xff0c;一个主要由亡命之徒组成的组织。他们表面上从事运输业务&#xff0c;但背地里进行偷渡和走私活动。 …