String
1. String 类
1.1 基本知识
- string类是模板类:
typedef basic_string<char> string;
- 使用string类要包含头文件
<string>
- string对象的初始化:
string s1("Hello");
string s2= "Hello";
string s3(8, 'x'); // s3 == "xxxxxxxx"
- 错误的初始化:
string error1 = 'c';
string error2('c');
string error3 = 22;
string error4(8);
TIPS:可以将字符赋值给一个string对象
string s;
s = 'c';
- 一些操作:
1) length()
:读取string对象的长度
string s("hello");
cout << s.length() <<endl;
2)string支持流读取运算符(可以通过cin读取string对象,读到空格、换行、’\t’ 停止)
string s;
cin >> s;
- string支持getline函数(从cin读取一整行)
string s;
getline(cin, s);
- string的赋值和连接
a)用=赋值
string s1("cat"), s2;
s2 = s1;
b)用assign成员函数复制
string s1("hello"), s3;
s3.assign(s1); //s3 == "hello"
c)用assign成员函数部分复制
string s1("hello world"), s3;
s3.assign(s1, 0, 5); //s3 == "hello"
//从下标0开始,复制5个字符
d) 单个字符复制
s2[5] = s1[3] = "a";
e) 逐个访问string对象中的字符
string s1("hello");
for(int i=0; i<s1.length(); ++i)
cout << s1.at(i) <<endl;
//或者cout << s1[i] <<endl;
TIPS: 成员函数at会做范围检查,如果超出范围,会抛出out_of_range
异常,而下标运算符[]
不做范围检查(速度快)
f) 用+运算符连接string对象
string s1("hello"), s2("world!");
s1 += s2;
cout << s1;
g)用成员函数append连接string对象
string s1("hello"), s2("world!");
s1.append(s2);
cout << s1;
s2.append(s1, 3, s1.size()); //s1.size(): s1字符数
//下标为3开始,s1.size()个字符,如果字符串内没有足够的字符,则复制到字符串最后一个字符
cout << s2;
h) 比较string对象:
- 直接用关系运算符:字典序
- 用成员函数compare()
:
string s1("abcde"), s2("abcde"), s3("abcdd");
int f1 = s1.compare(s2);
//s1 == s2 , return : 0
int f2 = s1.compare(s3);
//s1 > s3 , return : 1
int f3 = s3.compare(s1);
//s3 < s1 , return : -1
int f4 = s1.compare(1, 2, s3, 0 , 3);
//比较s1:1-2(bc) > s3:0-3(abcd) , return : 1 |1,2:下标从1开始的2个字符
int f5 = s1.compare(0, s1.size(), s3);
//比较s1:0-end(abcde) > s3 , return : 1
i) 求子串:成员函数substr()
string s1("hello world"), s2;
s2 = s1.substr(4, 5);
//将s1下标4开始的5个字符赋给s2,若超过s1长度,到最后一个字符为止
//输出: s2 == o wor
j) 交换string:成员函数swap()
string s1("hello world"), s2("really");
s1.swap(s2);
//输出:s1 == really; s2 == hello world;
k)寻找string中的字符
- 查找指定子串:
- 从前向后找:成员函数
find()
string s1("hello world");
s1.find("lo");
//输出: 3
s1.find("ll", 1);
//从下标1开始查找
功能:在s1中从前向后查找,"lo"第一次出现的地方,如果找到,返回"lo"开始的位置,即’l’所在的位置的下标
TIPS:如果找不到,返回string::npos
(string中定义的静态常量)
- 从后往前找:成员函数
rfind()
- 查找给出字符串中任一字符/ 给出字符串字符以外的任一字符
查找给出字符串中任一字符
- 首次出现:成员函数
find_first_of()
string s1("hello world");
s1.find_first_of("abcd");
功能:在s1中从前向后查找,"abcd"中任何一个字符第一次出现的位置,找到返回对应下标,找不到返回string:npos
- 最后出现:成员函数
find_last_of()
功能:找’a’、‘b’、‘c’或’d’,最后一次出现的位置(等于说是,从后往前找这4个字符第一次出现的位置)
给出字符串字符以外的任一字符(查找’a’、‘b’、‘c’、'd’以外的任何字符)
- 首次出现:成员函数
find_first_not_of()
- 最后出现:成员函数
find_last_not_of()
l)删除string中的字符:成员函数earse()
string s1("hello world");
s1.earse(5); //删除下标5以后的字符(包括5)
cout << s1; //输出:s1 == hello
cout << s1.length(); //输出:5
cout << s1.size(); //输出:5
m) 替换string中的字符:成员函数replace()
string s1("hello world");
s1.replace(2, 2, "abcd"); //输出:heabcdo world
TIPS:下标2开始的2个字符,替换成"abcd"
s1.replace(2, 2, "abcd", 1, 2);
//输出:hebco world
TIPS:“ll"替换"abcd"中下标1开始的2个字符,即"bc”
n) 在string中插入字符:成员函数insert()
string s1("hello world");
string s2("show insert");
s1.insert(5, s2);
//输出:helloshow insert world
功能:将s2插入s1下标5的位置
s1.insert(2, s2, 5, 3);
//输出:heinso world
功能:将s2下标5开始3个字符插入到s1下标2处
o)将string转换成C语言式char *
字符串:
- 成员函数
c_str()
string s1("hello world");
printf("%s\n", s1.c_str());
//输出: hello world
功能:s1.c_str()返回传统的const char *
类型字符串,且该字符串以’\0’结尾
- 成员函数
data()
string s1("hello world");
const char * p1 = s1.data();
for(int i=0; i<s1.length(); ++i)
printf("%c", *(p1 + i));
//输出:hello world
功能:s1.data返回一个char *
类型的字符串,对s1的修改可能会使p1出错
- 字符串流处理:
除了标准流和文件流输入输出外,还可以从string进行输入输出
类似istream
和ostream
进行标准流输入输出,我们用istringstream
和ostringstream
进行字符串上的输入输出,也称为内存输入输出
头文件:
#include <string>
#include <iostream>
#include <sstream>
- 实例1:字符串输入流istringstream
通过字符串来进行输入
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
int main(){
string input("Input test 123 4.7 A");
istringstream inputString(input);
string s1, s2;
int i;
double d;
char c;
inputString >> s1 >> s2 >> i >> d >> c;
//类似cin ,input中对应部分分别读入到s1,s2,i,d,c中
cout << s1 << endl << s2 << endl;
cout << i << endl << d << endl << c << endl;
long L;
if(inputString >> L)
cout << "long\n";
else
cout << "empty\n";
return 0;
}
- 实例2:字符串输出流
istringstream
将本该输出到屏幕的内容,输出的字符串中
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
int main(){
ostringstream outputString;
int a = 10;
outputString << "This" << a << "ok" << endl;
//将ostringstream对象outputString,类似于cout来使用
cout << outputString.str();
//outputString.str():将放入流中的字符串拿出来
//返回值类型为string
return 0;
}