启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
和其他语言类似,c++ 的string也定义了很多实现了的方法,这些方法可以是包含在对象当中的函数,也可以是基于+,<< 运算的方法,通过这些方法可以方便的操作c++的string 对象。那我们来聊聊这些方法和使用过程当中需要注意的点吧。
string的操作
首先先列出今天要说明的string对象的方法:
| 方法 | 描述 |
|---|---|
| os<<str | 将str写到输入流os当中,返回os |
| is>>str | 将is读取到的字符串赋值给str,字符串以空格切分,返回is |
| getline(is,str) | 从is当中读取一行,赋值给str,返回is |
| str.empty() | 判断string对象是否为空,为空返回true |
| str.size() | 返回string对象当中字符的个数 |
| str[n] | 返回str的第n个引用,注意:n从0开始计数 |
| str1+str2 | 返回str1拼接str2的结果 |
| str1 = str2 | 用str2的副本代替str1原来的字符 |
| str1 == str2 | 判断str1当中的字符是否和str2当中的相等,注意:大小写敏感 |
| str1 != str2 | 判断str1当中的字符是否和str2当中的相等,注意:大小写敏感 |
| <,<=,>,>= | 利用字符在字典当中的顺序进行比较,且大小写敏感 |
方法的描述很简单,但是有些关键词还是需要理解的:
流:
C++中把数据之间的传输操作称为流,流既可以表示数据从内存传送到某个载体或设备中,即输出流,也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流。
C++提供的流(stream)包括三种类型:用于控制台输入、输出的流、用于文件操作的文件流和用于字符串处理的字符串流。 显然我们这里聊的是字符串流。
副本
副本就是copy,copy就是拷贝,复制。
副本的好处:
不影响原件,这样一份原始数据可以共享多次。
坏处:
复制需要时间和内存空间,影响性能。
而且原件发生改变的时候不会自动更新,得手动重新获取副本。
字符字典
这里准确的将是字符串的字典序,字典序(dictionary order),又称 字母序(alphabetical order),原意是表示英文单词在字典中的先后顺序,在计算机领域中扩展成两个任意字符串的大小关系。
英文中的 字母表(Alphabet) 按照如下的顺序排列:
ABCDEFG HIJKLMN OPQRST UVWXYZ
abcdefg hijklmn opqrst uvwxyz
读写string
首先在这里聊一下c++当中的读入写出方法,c++的输入输出方法使用还是需要导入iostream头文件的,在iostream当中,cin代表获取用户输入方法,cout代表获取用户输出方法。
#include <iostream>
#include <string>
int main(){
using namespace std;
string str; //定义空白字符串
cin >> str; //将输入内容读入str对象
cout << str << endl; //输出str对象
return 0;
}
这里需要注意:
1、string对象会自动忽略字符串开头的空(包括空格,换行,tab制表符)。
2、在第1点的基础上,读取过程当中遇到一个空格结束读取。 所以我们输入“ hello world!”,str接收到的也只是“hello”. 所以对于中间有空格的字符串在接收的时候可以采用多个变量:
#include <iostream>
#include <string>
int main(){
using namespace std;
string str1;
string str2;
cin >> str1 >> str2; //输入内容按照空格分给了str1和str2,
cout << str1 << str2 << endl; //输出两个变量,但是中间没有间隔
return 0;
}
所以,这个时候输入“ hello world!”得到的就是“helloword”
当然,上面的解决方法对于不确定个空格的情况下会很苍白,到底多少个变量对于空格去是一个难搞的问题,所以可以用getline方法来读取完整的一行:
#include <iostream>
#include <string>
int main(){
using namespace std;
string str1;
getline(cin,str1);
cout << str1 << endl;
return 0;
}
string查看
s.empty和e.size是两个比较直观的方法,我们直接看。
#include <iostream>
#include <string>
int main(){
using namespace std;
string str1;
getline(cin,str1);
cout << str1.empty() << endl;
cout << str1.size() << endl;
return 0;
}
比较string
这里我们先基于代码琢磨一下比较的原理:
#include <iostream>
#include <string>
int main(){
using namespace std;
string str1="hellp";
string str2="hello";
int flag = (str1 == str2);
cout << flag << endl;
return 0;
}
字符串比较是按照字典的顺序进行比较的,从左到右,如果遇到第一个不一样的就开始按照字典顺序进行比较,然后就可以得到结果了,举个栗子:
string运算
这里有一个关键的点就是不可以字面值直接相加,因为字面值的类型可以是多种,所以需要注意,直接在运算两边使用字面值会导致报错。
main.cpp:11:27: error: invalid operands of types ‘const char [6]’ and ‘const char [5]’ to binary ‘operator+’
代码如下:
#include <iostream>
#include <string>
int main(){
using namespace std;
string str1="hello";
string str2="word";
string str3 = str1 + str2; //string对象相加
str1 += str2; //自增,相当于 str1 = str1+str2
string str4 = str1 + " " + str2; //运算符两边有string是没有问题的
string str5 = "hello"+"word"; //报错
cout << str1 << endl;
cout << str3 << endl;
cout << str4 << endl;
return 0;
}
关于c++ String对象操作就先聊这么多了,还请各位大佬多多指点。