String类与二维字符数组
string类
C语言风格字符串的特点:
- 执行拷贝、比较等操作,都需要调用函数
- 字符串长度大于分配空间时,下标会越界
string类也叫字符串,是C++标准库把字符数组封装起来的类。而且,string类具有更多的特性功能
声明string类型的格式如下:
//采用 类型 变量名;
string str;
string类型的初始化格式如下:
//采用 类型 变量名;
string str = "hello world";
string类的基本操作
表达式 | 功能 |
---|---|
s1 += s2 | 将s2拼接在s1后面 |
s1 = s2 | 将s2的值赋给s1 |
s1 == s2 | 判断2个字符串是否相等 |
s1 < s2 | 判断s1是否小于s2 |
s1[i] | 访问s1中下标为i的字符 |
string类的基本功能
表达式 | 功能 |
---|---|
s1.length()/s1.size() | 返回s1字符串的长度 |
s1.substr(a,b) | 截取s1中下标为a到b的字符串 |
s1.insert(a,'s') | 在s1中下标为a的位置插入字符s |
使用案例
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1 = "Hello";
string s2 = "World";
cout << "s1的长度:" << s1.length() << endl;
cout << "s2的长度:" << s1.size() << endl;
cout << "截取s1的下标2到4的元素:" << s1.substr(2,4) << endl;
cout << "将s1和s2进行连接:" << s1 + "," + s2 << endl;
s1.insert(5,'c');
cout << "在s1的下标5的位置插入字母c:" << s1 << endl;
return 0;
}
字符串的输入
使用cin来输入字符串,当字符串中包含空格的时候输入就会停止,后面的数据就会接收不到。
//数组字符串的输入格式:
cin.getline(数组名,长度);
gets(数组名)
//string字符串的输入格式:
getline(cin,string变量名);
输入案例
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1;
//遇到空格就会停止
cin >> s1;
cout << s1 << endl;
}
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1;
//会读取空格
getline(cin,s1);
cout << s1 << endl;
}
问题
问题2.1
输入2行不超过100,只包含数字和空格的字符串,编写程序判断在忽略空格的前提下,2个字符串是否一样,如一样输出“YES”,否则输出“NO”
输入:hel lo hello
输出:YES
问题分析:
1.由于输入可能会有空格,因此使用getline()函数来获取输入
2.对两个字符串进行遍历,如果遇到空格,则跳过,发现有不同的字符存在,则结束循环
3.输出最后的结果
示例代码
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1;
string s2;
int i = 0,j = 0; //定义两个变量,用于遍历
getline(cin,s1); //用getline获得两个输入
getline(cin,s2);
cout << s1 << endl;
cout << s2 << endl;
while(i < s1.length() || j < s2.length()){ //对两个字符串进行遍历
if (s1[i] == ' '){ //发现s1有空格,则跳过
i++;
}
if(s2[j] == ' '){ //发现s2有空格,则跳过
j++;
}
if (s1[i] != s2[j]) break; //发现有不同的字符,则退出遍历
i++;j++;
}
if (i == s1.length() || j == s1.length()){ //其中一个已经遍历完成,则说明是相同的,否则不相同
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
二维字符数组
在有的时候,我们可能需要存储多句话,我们可以定义多个字符串来存储
char s1[100] = "";
char s2[100] = "";
char s3[100] = "";
cin >> s1;
cin >> s2;
cin >> s3;
但如果我们要存储很多句话,我们不能单个去定义,我们可以使用二维字符数组
char s[10][100];
以上定义了一个二维字符数组,表示10个大小为100的字符数组
我们可以通过循环的方式不断获取10个输入
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char s[10][100];
//因为有10个大小为100的字符数组,需要进行10次输入
for (int i = 0;i < 10 ;i++){
cin >> s[i];
}
//输出结果
for (int i = 0;i < 10 ;i++){
cout << s[i] << endl;;
}
}
课后练习
输入一行包含空格且长度不超过100的字符串,统计其中的大写和小写字母的个数,如果大写字母多就输出“Y”,小写字母多久输出“N”,相等输出“O”
输入:Good
输出:N