详解C++字符串函数与字符数组附带例题

本文详细介绍了C++中字符串的使用,包括字符型与字符串型的区别、存储方式、读取方式以及常用的字符串函数,如strlen、strcat、strcmp等,并通过实例展示了如何进行字符串的输入、输出、比较和操作。此外,还提供了几个示例题目,涉及字符串的字母计数、字母排序和游戏模拟等应用场景。
摘要由CSDN通过智能技术生成

C++中的字符串

在C++中对数据类型的要求很严格,将数据类型分为了多种,int 整型 ,float 浮点型,char 字符型,string 字符串型

1.字符型与字符串型的区别
言简意赅:单个字符,叫字符,连续的多个字符,叫字符串

2.存储的方式
一般的字符会使用char 关键字来存储,字符串的存储方式有两种,第一种为char类型的数组

3.读取字符串的方式
在使用char字符数组或string字符串时,都能通过数组的读取方式来获得对应位置的字符。

字符串定义

char a[100];//定义一个能够存储100个字符的数组
char n[20]={'a','b','c','d'};//为字符数组赋值,需要一个一个的赋值

//1.输入方式

   cin>>a;

   scanf("%s",&a);//字符串的占位符为%s
   
//在不添加特定的头文件时,常用的输入方式都能对字符串进行输入

   gets(a);

//在使用*gets()*输入函数时,需添加特定的头文件#include<iostream>

//2.输出方式

   cout<<a;

   printf("%s",a);

//在不添加特定的头文件时,常用的输入方式都能对字符串进行输入

   puts(a);

//在使用*puts()*输入函数时,需添加特定的头文件#include<iostream>

字符串使用

字符串的读取
字符串在存储时,是按照一定的序列的下标来进行存储的,所以我们只需要按照规定的下标进行读取,就能够获取到对应的字符。

	char n[100]={'1','2','3','4','5','6','7','8','9'};
	    //循环字符数量
	for(int i=0;i<9;i++){
		cout<<n[i]<<" ";
		//将字符数组中的每一个字符取出;
	}

char字符数组的函数
在对字符数组中的字符串中的字符进行操作时,需要用到函数才能准确的达到我们想要的效果
获取长度函数: strlen()
strlen函数会为我们返回一个整型的数字,所以想要获取到字符串的长度的时候,需要设立一个变量来存储返回的数字。或者直接调用到使用的位置

char n[100]={'a','b','c','d'};
int num;
num=strlen(n);
//此时num的值为字符数组n中的字符数量

小写转换函数

char str1[100]="ACDFSFFS";
char str2[100]="asdfagde";
strlwr(str1);//将大写字母转换成小写字母
strupr(str2);//将小写字母转换成大写字母
//转换后的结果存在原字符串中

给字符数组赋初值函数: memset(数组名,赋值量,要赋值的空间大小)

char n[100];
int num;
memset(n,'0',sizeof(n)//将n数组中所有元素赋初始值为'0'

复制函数: strcpy(字符串1,字符串2)

注意这个时候,a字符串中的所有字符已经丢失,b字符串中的字符已经将a字符串覆盖,b字符串里面的元素没有改变

复制函数2.0):strncpy(字符串1,字符串2,长度n)

使用固定长度复制方式,可以将字符串2当中,前n个字符,复制到字符串1前n个元素,字符串1只改变前面n个,其他的不变

char a[20],b[20];
strcpy(a,b);
//将b字符串赋值到a当中
strncpy(a,b,3);
//将b字符串中前面3个字符复制到a字符串前面3个元素中,后面的不变

比较函数(1.0): strcmp(字符串1,字符串2)

在比较函数中,会通过ASCII(美国信息交换标准代码)码值进行比较,会区分字母大小写。
在比较时函数给我们的返回值是一个整型数,分为三种情况:
返回值 > 0:表示字符串1 > 字符串2
返回值 = 0:表示字符串1 = 字符串2
返回值 < 0:表示字符串1 < 字符串2

比较函数(2.0): strncmp(字符串1,字符串2,长度n)

函数的比较方式和前面的比较方式是一样的,不同的是,在比较的时候我们能够控制比较的长度,这里的长度是按照0下标为起始,比较往后的n个字符

比较函数(3.0): stricpy(字符串1,字符串2)

这里的函数在比较字母的时候不在区分大小写进行比较,而是直接按照字符的大小进行比较(a<z);

小结: 到这里我们不难发现,在使用比较函数的时候,不同的函数的写法只有些许细微的差别,需要比较长度,在str与cmp之间加上n(strncmp)。

比较是不区分大小写时,在str与cmp之间加上i(stricmp);
strcmp(字符串1,字符串2) ;区分大小比较函数
strncmp(字符串1,字符串2,n长度); 区分大小比较前n个字符函数
stricmp(字符串1,字符串2,n长度) ;不区分大小比较函数
strnicmp(字符串1,字符串2,n长度) ;不区分大小比较前n个字符函数
strcasecmp(字符串1.字符串2); 苹果/Linux系统下的比较函数

char a[20],b[20];

strcmp(a,b);
//区分大小比较函数

stricmp(a,b);
//不区分大小比较函数

strncmp(a,b,3);
//区分大小比较前n个字符函数

strnicmp(a,b,3);
//不区分大小比较前n个字符函数

strcasecmp(a,b);
//苹果/Linux系统下的比较函数

字符连接函数:strcat(字符串1,字符串2)

将字符串2连接到字符串1后面,拼接后字符串1中后面的\0没有了,在拼接后的字符串最后加上\0;

char a[20],b[20];

strcat(a,b);
//将b字符串拼接到a字符串后面

strncat(a,b,3);
//将b字符串前面3个字符,拼接到a字符串后面
strcat(a,&b[3]);
//将字符串b从3位置后面所有字符和a字符串拼接

查找子串函数:strstr(字符串1,字符串2)

char str1[100],str2[100];
cin.geline(str1,100);
cin.geline(str2,100);
strstr(str1,str2);
查看str2是否为str1的字串,如果是函数返回true,否则返回false
总结:以上的字符串函数,我们可以把他们的功能我们可以大致分为三种。
1.复制   2.比较    3.连接   4.求长度  5.输入/输出
我们在不同的情况时,去使用对应的函数,最常用的就是5、4、2

字符串例题

例1: 给出一个随机字符串(数量不超过100),判断有多少字母?多少数字?

#include<iostream>
#include<cstring> 
using namespace std;
int main(){
	char n[100];
	int ni=0,nc=0,len;
	gets(n);
	len=strlen(n);	
	for(int i=0;i<len;i++){
		if(n[i]>='a'&&n[i]<='z'||(n[i]>='A'&&n[i]<='Z')){
			nc++;
		}
		if(n[i]>='0'&&n[i]<='9'){
			ni++;
		}
	}
	cout<<nc<<" "<<ni;
	return 0;
}

例2: 编写一个程序,设定一个有大小写字母的字符串(数量不超过100),先将字符串的大写字符输出,再将字符串中的小写字符输出。

#include<iostream>
#include<cstring> 
using namespace std;
int main(){
	char n[100];
	int len;
	gets(n);
	len=strlen(n);
	for(int i=0;i<len;i++){
		if(n[i]>='A'&&n[i]<='Z'){
			cout<<n[i];
		}
	}
	cout<<endl;
	for(int i=0;i<len;i++){
		if(n[i]>='a'&&n[i]<='z'){
			cout<<n[i];
		}
	}
	return 0;
}

例3: 随机输入一段英文句子(字母长度不超过1000),编写程序计算出这段英文单词中有多少个英文单词。每一个单词用空格隔开。

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	char n[1000];
	int m=0,len;
	gets(n);
	len=strlen(n);
	for(int i=0;i<=len;i++){
		if(n[i]==' '||n[i]=='\0'){
			m++;
		}
	}
	cout<<m;
	return 0;
}

例题4: 卡牌游戏

甲、乙两位同学分别有n、m(n=m<20)张奥特曼卡片,平时他们会将手中的卡牌进行对局,获胜方将会获得失败方的全部卡牌,卡牌的面值会以字母形式呈现,现在请你编写一个程序,用来模拟他们的游戏,为了确保游戏的公平,你作为裁判需保证双方卡牌数量一致,作为报酬,裁判会收取双方各一张卡牌(从获胜方收取最后两张卡牌),如果双方手牌都相同,则输出“平局”,无需输出双方手牌。

获胜规则:按顺序出牌只要有一方的卡牌大谁就获胜。

输入要求:输入两位同学当前手中的卡牌,为了避免作弊,保证游戏的公平,输入的字符只包含字母(大小写不限),输入一串字符串,每一个字符代表一张卡牌

输入要求:输出两位同学手中的卡牌数量及卡牌

样例输入:
kfghtizg
Kfghtzez
样例输出:
0
14
Kfghtzezkfghti

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	char a[20],b[20],c[100];
	gets(a);
	gets(b);
	int x;
	x=stricmp(a,b);
	if(x==0){
		cout<<"平局";
	}
	//cout<<x<<endl;
	if(x>0){
		strncat(a,b,strlen(b)-2);
		cout<<strlen(a)<<endl<<'0'<<endl;
		puts(a);
	}else{
		if(x<0){
			strncat(b,a,strlen(a)-2);
			cout<<'0'<<endl<<strlen(b)<<endl;
			puts(b);
		}	
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给包番茄酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值