字符串--字符串处理函数、向函数传递字符串

news2024/10/5 17:41:09

一、字符串处理函数
字符串处理函数库提供了很多有用的函数用于字符串处理操作(如复制字符串和拼接字符串等)以及确定字符串的长度。若要使用这些字符串处理函数,必须在程序的开头将头文件<string.h>包含到源头文件。
例题1:编程实现按奥运会参赛国国名在字典中的顺序对其入场次序进行排序。假设参赛国不超过150个。

#include <stdio.h>
#include <string.h>
#define max_len 10
#define N 150
void sortstring(char str[][max_len],int n);
int main(void)
{
	int i,n;
	char name[N][max_len];
	printf("How many countries?");
	scanf("%d",&n);
	getchar();
	printf("Input their names:\n");
	for(i=0;i<n;i++)
	{
		gets(name[i]);
	}		
	sortstring(name,n);
	printf("Sorted results:\n");
	for(i=0;i<n;i++)
	{
		puts(name[i]);
	}
	return 0;
}

void sortstring(char str[][max_len],int n)
{
	int i,j;
	char temp[max_len];
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(strcmp(str[j],str[i])<0)
			{
				strcpy(temp,str[i]);
				strcpy(str[i],str[j]);
				strcpy(str[j],temp);
			}
		}
	}
}

在这里插入图片描述
程序第27~43行是用交换法实现的字符串按字典顺序排序的函数。
注意:程序37~39行的字符串赋值操作不同于单个字符的赋值操作,对单个字符进行赋值操作可以使用赋值运算符,但是赋值运算符不能用于字符串的赋值操作,字符串赋值只能使用函数strcpy()。例如本例使用下面的赋值操作来替换第37-39的赋值操作就是错误的。
temp = str [i];
str[i] = str[j];
str[j] = temp;
另外,程序第35行比较字符串的方法不同于比较单个字符的方法。比较单个字符可以使用关系运算符,但比较字符串不能直接使用关系运算符。
例如,不能使用: if (str[j]<str[i])
而应使用函数strcmp()来比较字符串的大小,如本例题第35行语句所示。

字符串比大小是,实际上是根据两字符对比是出现的第一对不相等的字符的大小来决定它们所在字符串的大小。例如。字符串“American”小于“Australia”,即strcmp(“American”,“Australia”)的函数值小于0,是因为字符’m’<‘u’。再如,字符串“Hello China”大于字符串“Hello”,即strcmp(“Hello China”,“Hello”)的函数值大于0,这是因为’\0’的ASCII码值为0,其是ASCII码表中ASCII码值最小的,所以若一个字符串是另一个字符串的子串,即字符串中前面的字符都相同,那么长的字符串一定大于短的字符串。
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
那么计算机是如何直到一个特定的字母是否排在另外一个字母之前呢?其实,所有的字母在计算机中都是被表示成数字编码(Numeric Codes)的。当计算机比较字符串时,实际比较的是字符串中字符的数字编码。在不同的计算机中,表示字符的内部数字编码可能是不同的。为了使字符表示标准化,绝大多数计算机生产产商都采用主流的编码方案ASCII(American Standard Code for Information Interchange,美国信息交换标准码)或EBCDIC(Extended Binary Coded Decimal Interchange Code,扩充的二-十进制交换码)来设计它们的机器。
对于字符串和字符的操作实际上是对相应的数字编码而非字符本身的操作。这就是C语言字符和短整型数据具有可交换性的原因。既然一个数字编码大于、小于或者等于另外一个数字编码是有意义的,那么同通过数字编码就可以建立不同字符串或字符之间的关系了
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

二、向函数传递字符串
因为字符数组和字符指针都可以存取C字符串,因此,向函数传递字符串时,既可以使用字符数组作函数参数,也可以使用字符指针作函数参数。
例题2:从键盘输入一个字符串a,将字符串a复制到字符串b中,在输出字符串b,即编程实现字符串处理函数strcpy()的功能,但要求不能使用字符串处理函数strcpy()。

#include <stdio.h>
#define N 80
void mystrcpy(char datastr[],char stcstr[]);
int main(void)
{
	char a[N],b[N];
	printf("Input a string:");
	gets(a);
	mystrcpy(b,a);
	printf("The copy is:");
	puts(b);
	return 0; 
 } 
 
void mystrcpy(char datastr[],char stcstr[])
{
	int i=0;
	while(stcstr[i]!='\0')
	{
		datastr[i]=stcstr[i];
		i++;
	 } 
	datastr[i]='\0';
} 

在这里插入图片描述
用字符数编程实现字符串复制的示意图如下图所示。字符数组的下标从0开始变化(如程序第17~21行所示),控制当前复制的是字符数组srcstr中的第几个字符。

注意:与使用其他类型数组不同的是,通常不使用长度即计数控制的循环来判断数组元素是否遍历结束,而使用条件控制的循环,利用字符串结束标志’\0’判断字符串中的字符是否遍历结束(如第18行所示)。若当前取出的字符srcstr[i]不是’\0’,则继续执行第20行的字符赋值操作,否则结束循环,在datastr的末尾添加’\0’表示datastr中字符串的结束。
如果将第23行语句注释掉,那么在输出复制后的字符串时,将会在实际复制的字符后面显示出一些乱码,具体结果与系统和用户输入的字符串长度有关。
在这里插入图片描述
例题3:利用指针实现例题2的功能。

#include <stdio.h>
#define N 80
void mystrcpy(char *datastr,char *stcstr);
int main(void)
{
	char a[N],b[N];
	printf("Input a string:");
	gets(a);
	mystrcpy(b,a);
	printf("The copy is:");
	puts(b);
	return 0; 
 } 

void mystrcpy(char *datastr,char *srcstr)
{
	while(*srcstr!='\0')
	{
		*datastr = *srcstr;
		srcstr++;
		datastr++;
	}
	*datastr='\0';
}

结果与例题2一致。

例题4:从键盘任意输入一个字符串,计算其实际字符个数并打印输出,即不适用字符串处理函数strlen()编程实现strlen()的功能。

#include <stdio.h>
#define N 89
unsigned int mystrlen(const char str[]);

int main(void)
{
	char str[N];
	unsigned int a;
	printf("Input the str:");
	gets(str);
	a=mystrlen(str);
	printf("The strlen is a=%d",a);
	return 0;
}

unsigned int mystrlen(const char str[])
{
	int i;
	unsigned int len=0;
	for(i=0;str[i]!='\0';i++)
	{
		len++;
	}
	return len;
}

在这里插入图片描述
例题4:方法2,使用指针实现。

#include <stdio.h>
#define N 89
unsigned int mystrlen(const char *str);

int main(void)
{
	char str[N];
	unsigned int a;
	printf("Input the str:");
	gets(str);
	a=mystrlen(str);
	printf("The strlen is a=%d",a);
	return 0;
}

unsigned int mystrlen(const char *str)
{
	unsigned int len=0;
	for(;*str!='\0';str++)
	{
		len++;
	}
	return len;
}

本例题程序在函数mystrlen()的数组或指针形参前加上了const类型限定符,这是希望在被调函数中不会被修改数组元素的值。
当在形参类型前加上类型限定符const后,就可以保护相应的形参不会再函数体内被修改。

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

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

相关文章

什么是Vue的前端微服务架构(Micro Frontends)?

什么是Vue的前端微服务架构&#xff08;Micro Frontends&#xff09;&#xff1f; 前端微服务架构&#xff08;Micro Frontends&#xff09;是一种新型的前端架构风格&#xff0c;它借鉴了后端微服务架构的思想&#xff0c;将前端应用程序拆分为多个小型、独立的部分&#xff…

系统学习Spring,阿里最新产Spring全家桶进阶笔记真的很全

Spring是我们Java程序员面试和工作都绕不开的重难点。很多粉丝就经常跟我反馈说由Spring衍生出来的一系列框架太多了&#xff0c;根本不知道从何下手&#xff1b;大家学习过程中大都不成体系&#xff0c;但面试的时候都上升到源码级别了&#xff0c;你不光要清楚了解Spring源码…

混沌演练状态下,如何降低应用的MTTR(平均恢复时间) | 京东云技术团队

在企业业务领域&#xff0c;锦礼是针对福利、营销、激励等员工采购场景的一站式解决方案&#xff0c;包含面向员工、会员等弹性激励SAAS平台。由于其直接面向公司全体员工&#xff0c;其服务的高可用尤其重要&#xff0c;本文将介绍锦礼商城大促前夕&#xff0c;通过混沌工程实…

vue3 项目部署,Nginx配置https,重定向,详细流程

文章目录 前情提要应用场景安装使用 实战解析最后 前情提要 一个web项目完成后&#xff0c;我们需要打包部署上线&#xff0c;关于打包的实战在我的vite专栏里已经有过一些实践&#xff0c;今天我们来实践一些部署的过程&#xff0c;当然部署也可以由后端来完成&#xff1b; 应…

去面腾讯了(社招两年面试经验)

之前很多同学嚷嚷有没有社招经验&#xff0c;正好&#xff0c;我有个朋友去腾讯社招面试了。 他的面的是全栈开发岗位&#xff0c;工作两年&#xff0c;后端是Go&#xff0c;前端是 JavaScript Vue。 因为工作也没多久&#xff0c;就两年时间&#xff0c;所以大概率可能还是…

Linux:用户和用户组

Linux系统中可以&#xff1a; 配置多个用户配置多个用户组用户可以加入多个用户组 Linux系统关于权限的管控级别有两个&#xff0c;即&#xff1a; 针对用户的权限控制针对用户组的权限控制 1、用户组管理 创建用户组&#xff0c;语法&#xff1a; groupadd 用户组名 删除用户组…

NLP——Summarization

文章目录 Extractive summarisationSingle-documentcontent selectionTFIDF MethodLog Likelihood Ratio Method对数似然比Sentence Centrality Method 句子中心法 RST Parsing Multi-documentContent selectionMaximum Marginal Relevance 最大边际相关性Information Ordering…

详细介绍ROS中通过shell文件依次启动多个launch文件

本文主要介绍如何在ROS中通过shell文件依次启动多个launch文件&#xff0c;并介绍如何在同一个窗口的不同选项卡中依次启动多个launch文件。 一、先来看一个简单的示例&#xff1a; #!/bin/bashgnome-terminal -- bash -c "roslaunch bringup racecar_gazebo_rviz_znc.la…

Word控件Spire.Doc 【其他】教程(9):从 Word 文档中提取 OLE 对象

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

NestJs 管道(Pipe)

&#x1f384;Hi~ 大家好&#xff0c;我是小鑫同学&#xff0c;资深 IT 从业者&#xff0c;InfoQ 的签约作者&#xff0c;擅长前端开发并在这一领域有多年的经验&#xff0c;致力于分享我在技术方面的见解和心得 &#x1f680;技术&代码分享 我在 94Code 总结技术学习&…

Windows下安装运行Kafka(最底下有遇到的坑与解决方法)

注&#xff1a;安装kafka需要提前安装Zookeeper 一、Zookeeper安装 1. 下载安装包 https://zookeeper.apache.org/releases.html 注意&#xff1a;要下载带bin的安装包 2. 解压并进入ZooKeeper目录&#xff0c;如&#xff1a;D:\onworking\apache-zookeeper-3.7.0-bin&…

ansible剧本模式特殊模块使用

Nginx安装剧本 ansible-playbook test1.yaml //补充参数 -k&#xff08;-ask-pass&#xff09;&#xff1a;用来交互输入ssh密码 -K&#xff08;-ask-become-pass&#xff09;&#xff1a;用来交互输入sudo密码 -u&#xff1a;指定用户 -e:命令行指定变量 --syntax-check…

【服务器数据恢复】HP LeftHand存储raid5不可用的数据恢复案例

HP LeftHand存储简介&#xff1a; HP LeftHand存储支持搭建RAID5、RAID6、RAID10磁盘阵列&#xff0c;支持卷快照&#xff0c;卷动态扩容等。服务端和客户端分别如下&#xff1a; LeftHand存储共有三个级别&#xff1a;物理磁盘、基于多个物理磁盘组成的逻辑磁盘&#xff08;ra…

广东电信突发故障,手机没信号,对讲机的重要性再次凸显

当我们常用的通信网络出现故障时&#xff0c;就会面临全网瘫痪的情况&#xff0c;这个时候无线电通信就显得尤为重要了&#xff01; 在6月8日下午两点左右&#xff0c;有多位广东电信的用户发现&#xff0c;自己的手机突然出现了打不出去电话&#xff0c;及上不了网的情况&…

Unity编辑器扩展-第四集-获取物体的方法

第三集链接&#xff1a;Unity编辑器扩展-第三集-添加按钮到组件菜单并且重置组件_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.改选中单个物体的名字 2.改选中所有物体的名字 3.选中了所有的物体&#xff0c;但只改第一层物体的名称 4.来个有用的&#xff08;选中的所有…

Python进阶语法之列表推导式

Python进阶语法之列表推导式 Python列表推导式是Python中最有魅力的特性之一&#xff0c;它提供了一种优雅、简洁的方式来创建列表。这种语法不仅使得代码更加简洁&#xff0c;易读&#xff0c;而且在某些情况下还可以提高代码的执行效率。接下来&#xff0c;我们将一起深入探…

SpringBoot中@ControllerAdvice的三种使用场景

一、全局异常处理 代码示例如下: /*** author qinxun* date 2023-06-14* Descripion: 业务层异常枚举*/ public enum ServiceExceptionEnum {SUCCESS(0, "成功"),ERROR(1, "失败"),SYS_ERROR(1000, "服务端发生异常"),MISSING_REQUEST_PARAM_E…

使用同步信号量和互斥信号量解决生产者和消费者问题

生产者和消费者问题 生产者和消费者问题是一个经典的进程同步问题。在这个问题中&#xff0c;生产者不断地向缓冲区中写入数据&#xff0c;而消费者则从缓冲区中读取数据。生产者进程和消费者进程对缓冲区的操作是互斥的&#xff0c;即任意时刻只能有一个进程对这个缓冲区进行…

RTU电流采集上传

RTU电流采集上传 案例说明器件 物联网平台开发代码修改三元组 测试 案例说明 本案例使用HD1&#xff08;RTU&#xff09;检测外部电流&#xff0c;并将电流上传阿里云端。 压力传感器输出电流信号&#xff0c;读取压力传感器数值时需要检测电流大小。haasHD1(RTU)有两路ADC—…

深度学习应用篇-元学习[16]:基于模型的元学习-Learning to Learn优化策略、Meta-Learner LSTM

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…