C++ string对象上的操作

1,201 阅读3分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}

字符串比较是按照字典的顺序进行比较的,从左到右,如果遇到第一个不一样的就开始按照字典顺序进行比较,然后就可以得到结果了,举个栗子: image.png

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对象操作就先聊这么多了,还请各位大佬多多指点。