两种字符串有什么区别——字符数组和字符串,初步认识STL
- 1.字符数组
- 1.1.基础语法介绍
- 1.2.例题1——自动修正
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例
- 输入 #1
- 输出 #1
- 1.3.另解——getchar和putchar函数
- 1.4.字符数组相关函数
- 2.字符串
- 2.1.字符串简介和基础功能
- 2.2.例题2——文字处理软件
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例
- 输入 #1
- 输出 #1
- 提示
- 3.STL库简介
1.字符数组
1.1.基础语法介绍
在C语言和C++中,我们可以使用""指明一个字符串。既然有存储字符的变量,那有没有存储字符串的变量呢?当然有。我们可以使用C语言风格的字符数组完成这一个功能。
char str[字符串大小];
跟整形数组一样,我们可以给字符数组赋一个初值。比如:
char str[30]="This is a string."
等同于
char str[30]={'T','h','i','s',' ','i','s',' ','a',' ','s','t','r','i','n','g','.'};
每个字符串后面都应当有一个终止符\0
,它的ASCII码值是0。所以定义字符数组时也应该开大一点。终止符在赋初值时会自动加上。
跟整形数组不同的是,字符数组可以直接输入和输出。比如:
char str[30];
cin>>str;
cout<<str;
注意:这样读入数组只能读到空格或换行符为止。无法读入空格。如果想解决这个问题就请耐心看下文吧。
根据数组的定义,我们可以得知,字符数组里存储的也是字符的ASCII码值。所以我们也可以跟字符变量一样直接使用ASCII码操作。
char str[30]="Hello world!";
cout<<(int)str[0];//跟数组一样,字符数组的下标也是从零开始。
1.2.例题1——自动修正
自动修正 - 洛谷
题目描述
大家都知道一些办公软件有自动将字母转换为大写的功能。输入一个长度不超过 100 100 100 且不包括空格的字符串。要求将该字符串中的所有小写字母变成大写字母并输出。
输入格式
输入一行,一个字符串。
输出格式
输出一个字符串,即将原字符串中的所有小写字母转化为大写字母。
输入输出样例
输入 #1
Luogu4!
输出 #1
LUOGU4!
题意分析:我们在前面已经介绍过大小写字母互相转换的方法,这里不再赘述,直接上代码。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
char a[110];//存储字符串
scanf("%s",&a);//格式化输入字符串
for(int i=0;a[i]!='\0';i++)//遍历字符串,注意从0开始,以'\0'结束
if(a[i]>='a'&&a[i]<='z')//如果是小写字母
a[i]-='a'-'A';//减去差值
printf("%s",a);//格式化输出字符串
return 0;
}
1.3.另解——getchar和putchar函数
getchar函数的作用是读入一个字符。我在while循环扩展一文中介绍过,如果感兴趣可以去看一看。
putchar函数的作用是输出一个字符。搭配起来就可以得到下面的代码。
#include<iostream>
#include<cstdio>//需要使用getchar和puchar函数
using namespace std;
int main(){
char c;
while((c=getchar())!=EOF)//循环读入一个字符
{
if(c>='a'&&c<='z')//如果是小写字母
c-='a'-'A';//减去差值
putchar(c);//输出这个字符
}
return 0;
}
1.4.字符数组相关函数
在cstring
头文件里提供了许多与字符数组相关的函数。使用它们,我们可以很便捷的完成一些功能。常见的几个字符数组相关函数如下:
函数 | 作用 |
---|---|
fgets(str,sizeof(str),stdin) | 强制输入字符数组str |
strupr(str); | 将字符数组str中的小写字母转大写字母 |
strlwr(str); | 将字符数组str中的大写字母转小写字母 |
strstr(str1,str2); | 判断字符数组str1是否是字符数组str2的子串,是就返回字符数组str1 |
strcat(str1,str2); | 将字符数组str2连接到字符数组str1后面,返回连接后字符数组str1的值 |
strncat(str1,str2,n); | 将字符数组str2连接到字符数组str1后面,返回连接后字符数组str1的值 |
strcpy(str1,str2); | 将字符数组str2复制到字符数组str1,返回字符数组str1的值 |
strncpy(str1,str2,n); | 将字符数组str2前n个字符复制到字符数组str1,返回字符数组str1的值 |
strcmp(str1,str2); | 比较字符数组str1和字符数组str2的大小,比较的结果由函数带回; 如果字符数组str1>字符数组str2,返回一个正整数; 如果字符数组str1=字符数组str2,返回0; 如果字符数组str1<字符数组str2,返回一个负整数 |
strncmp(str1,str2,n); | 比较字符数组str1和字符数组str2前n个字符的大小,函数返回值的情况同strcmp函数 |
2.字符串
2.1.字符串简介和基础功能
用字符数组储存字符串有许多风险。比如不能弹性变化长度,字符数组最大能储存的字符串长度就已经固定了。不能直接赋值或者复制,也有数组越界的风险。
在C++中,我们可以使用string
字符串类型储存字符串。其定义语法如下:
string 字符串名;
string还支持以下功能:
函数或运算符 | 作用 |
---|---|
str=“I’m a string.”; | 将等号左边的字符串赋值给右边的字符串变量 |
str1<str2; | 重载了所有的关系运算符,比较两个字符串字典序的大小 |
str1+=str2; | 重载了+和+=,返回将str2拼接到str2后面的字符串 |
getline(cin,str); | 强制输入字符串str |
s.size();和s.length(); | 返回字符串s的长度(不包括终止符’\0’) |
s.append(str); | 将字符串str拼接到字符串s的后面 |
s.substr(pos,len); | 截取字符串s从第pos个位置开始len个字符,并返回这个字符串 |
s.insert(pos,str); | 在字符串s的第pos个字符前插入字符串str,并返回这个字符串 |
s.find(str,pos); | 在字符串s中从第pos个字符寻找字符串str,并返回str第一次出现的位置, 如果找不到,在强制转换成int类型后会返回-1 (可以试试不强制转换会返回什么), pos可以省略,默认值是0 |
具体的细节和语法的制定会在以后讲解。
2.2.例题2——文字处理软件
文字处理软件 - 洛谷
题目描述
你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 0 0 0 个字符。需要支持以下操作:
1 str
:后接插入,在文档后面插入字符串 str \texttt{str} str,并输出文档的字符串;2 a b
:截取文档部分,只保留文档中从第 a a a 个字符起 b b b 个字符,并输出文档的字符串;3 a str
:插入片段,在文档中第 a a a 个字符前面插入字符串 str \texttt{str} str,并输出文档的字符串;4 str
:查找子串,查找字符串 str \texttt{str} str 在文档中最先的位置并输出;如果找不到输出 − 1 -1 −1。
为了简化问题,规定初始的文档和每次操作中的 str \texttt{str} str 都不含有空格或换行。最多会有 q q q 次操作。
输入格式
第一行输入一个正整数 q q q,表示操作次数。
第二行输入一个字符串 str \texttt{str} str,表示最开始的字符串。
第三行开始,往下 q q q 行,每行表示一个操作,操作如题目描述所示。
输出格式
一共输出 q q q 行。
对于每个操作 1 , 2 , 3 1,2,3 1,2,3,根据操作的要求输出一个字符串。
对于操作 4 4 4,根据操作的要求输出一个整数。
输入输出样例
输入 #1
4
ILove
1 Luogu
2 5 5
3 3 guGugu
4 gu
输出 #1
ILoveLuogu
Luogu
LuoguGugugu
3
提示
数据保证, 1 ≤ q ≤ 100 1 \leq q\le 100 1≤q≤100,开始的字符串长度 ≤ 100 \leq 100 ≤100。
题意分析:
使用上面介绍到的函数模拟这个过程就可以了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s,str;
int n,opt,l,r;
cin>>n>>s;
while(n--)
{
cin>>opt;
switch(opt)
{
case 1:
{
cin>>str;
s.append(str);//将str拼接到s的后面
cout<<s<<endl;
break;
}
case 2:
{
cin>>l>>r;
s=s.substr(l,r);//截取s从l起r个字符
cout<<s<<endl;
break;
}
case 3:
{
cin>>l>>str;
s.insert(l,str);//从l向s插入str
cout<<s<<endl;
break;
}
case 4:
{
cin>>str;
cout<<(int)s.find(str)<<endl;//寻找str第一次在s里出现的位置。记得强制转换
break;
}
}
}
return 0;
}
3.STL库简介
在C语言中有给我们带来诸多不便的地方,比如字符数组。于是在C++中提供了更好的工具——可使用标准模板库(Standard Template Library, STL)。将很多有用的功能进行了封装,开箱即用,并不需要重新开发这些功能。
其中包括了各类容器(比如队列、栈等)、算法(比如排序)和其他的一些功能等。
前面讲到的字符串(string)容器就是STL中的,可以帮我们带来很多便利。
后面我们经常会用到STL,现在要先熟悉一下。可以自己上网找资料,也可以看我专辑里接下来的文章。STL也是以后我们自己编写函数和类时的一个活生生的例子。
喜欢就订阅此专辑吧!
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育