引言
C++中提供了一种新的数据类型——字符串类型(string)。实际上string并不是C++的基本类型,它是在C++标准库中声明的一个字符串类,用这种数据类型可以定义对象,每一个字符串变量都是string类的一个对象。
标准库类型string表示可变长的字符序列,使用string类型必须首先包含它的头文件。
作为标准库的一部分,string定义在命名空间std中。
#include<string>
using namespace std;
string类的意义有两个:第一个是为了处理char类型的数组,并封装了标准C中的一些字符串处理的函数。而当string类进入了C++标准后,它的第二个意义就是一个容器。
一、string 字符串定义和赋值
//创建空字符串
string a; //只是在栈中声明了一个a的内存地址,并没有给它赋初值,也就是在没有在堆内存中申请内存地址,更没有在堆内存指向引用地址
string b=null; //在栈中声明了一个b的内存地址,在堆中也申请了一个内存地址,但是堆中的地址不指向任何栈里的引用地址
string c=""; //栈里申明一个string类型的c内存地址,堆内存里申请了地址,堆内存中的地址指向引用该字符串的栈内存中的c引用地址
//创建字符串对象
string c(); //同c="",创建空字符串
string d("hello"); //用"hello"创建一个字符串对象d
string e(10,'a'); //创建含有10个'a'的字符串对象
string f("abcde",1,3); //创建从下标1开始,长度为3的子串f
//由其他字符串创建
string s0("abcde");
string str1(s0); //将string对象初始化为s0对象(复制构造函数)
string str2="abcde";
//字符串赋值
string s0("abcde");
string str3;
str3 = "hello"; //或="k"或='k'
str3 = str2;
str3.assign("abcde", 2, 3); //string类还有assign成员函数用来赋值
二、string 字符串的拼接
//"+"、"+="实现字符串的拼接
string str1("hello");
string str2("world");
string str3 = str1 + str2;
str1 += 'a';
str2 += "abcd";
//append实现字符串的拼接
string s1("123"), s2("abc");
s1.append(s2); //在s1尾部添加全部s2
s1.append(s2, 1, 2); //在s1尾部添加s2的子串,子串为从下标1开始,长度为2
s1.append(3, 'K'); //在s1尾部添加3个‘K’
s1.append("ABCDE", 2, 3); //在s1尾部添加 "ABCDE" 的子串(2, 3)
//string.push_back() 函数在一个 string 对象后面附加一个字符
string str("hello");
char ch = 'a';
str.push_back(ch);
三、string 字符串的长度
size()方法和length()方法均可用于求字符串的长度。
//size()方法和length()方法均可用于求字符串的长度
string str = "abcde";
int a = str.size();
int b = str.length(); //a=b
四、string 字符串的比较
//挨个字符的ASCLL码来进行对比。可以关系运算符 <、<=、==、!=、>=、> 直接进行比较
//string 类还有 compare 成员函数,可用于比较字符串。
// 小于 0 表示当前的字符串小;
// 等于 0 表示两个字符串相等;
// 大于 0 表示另一个字符串小。
string s1("hello"), s2("hello, world");
int n = s1.compare(s2);
n = s1.compare(1, 2, s2, 0, 3); //比较s1的子串 (1,2) 和s2的子串 (0,3)
n = s1.compare(0, 2, s2); // 比较s1的子串 (0,2) 和 s2
n = s1.compare("Hello");
n = s1.compare(1, 2, "Hello"); //比较 s1 的子串(1,2)和"Hello”
n = s1.compare(1, 2, "Hello", 1, 2); //比较 s1 的子串(1,2)和 "Hello" 的子串(1,2)
五、string 字符串的子串
substr(n,m) 成员函数可以用于求子串 (n, m)。
//substr(n,m) 成员函数可以用于求子串 [n, m), 缺省值n=0, m=string::npos即 [first(), end())
string s1 = "this is ok";
string s2 = s1.substr(2, 4); //s1[2]、s1[3],不含s1[4]
string s3 = s1.substr(2); //如果省略 m 或 m 超过了字符串的长度,则求出来的子串就是从下标 n 开始一直到字符串结束的部分。
六、string 字符串的访问和遍历
可以通过[ ]或at()方法使用下标访问字符串中的元素。
front、back 成员函数可以用来获取或修改字符串第一个、最后一个字符。
//可以通过[]或at()方法使用下标访问字符串中的元素
string str("hello");
cout << str[2] << endl;
cout << str.at(2) << endl;
//string.front()、string.back()获取或修改字符串第一个、最后一个字符
str.front()='1';
str.back()='0';
//字符串的遍历
for (auto x: str1)
for (char x: str1)
for (size_t i=0; i<str1.size(); i++)
for (size_t i=str1.size()-1; i!=str1.size(-1); i--) //str1.size(-1)
七、string 字符串的子串查找
string 类有一些查找子串和字符的成员函数,它们的返回值都是子串或字符在 string 对象字符串中的位置(即下标)。如果查不到,则返回 string::npos。string: :npos 是在 string 类中定义的一个静态常量。(如果找到,则返回下标;否则返回常量string: :npos)
string s1("Source Code");
int n;
if ((n = s1.find('u')) != string::npos) //查找 u 出现的位置
if ((n = s1.find("Source", 3)) == string::npos) //从下标3开始查找"Source",找不到
if ((n = s1.find("Co")) != string::npos) //查找子串"Co"。能找到,返回"Co"的位置
if ((n = s1.find_first_of("ceo")) != string::npos) //查找第一次出现或 'c'、'e'或'o'的位置
if ((n = s1.find_last_of('e')) != string::npos) //查找最后一个 'e' 的位置
if ((n = s1.find_first_not_of("eou", 1)) != string::npos) //从下标1开始查找第一次出现非 'e'、'o' 或 'u' 字符的位置
八、string 字符串的子串替换
replace 成员函数可以对 string 对象中的子串进行替换,返回值为对象自身的引用。
string s1("Real Steel");
s1.replace(1, 3, "123456", 2, 4); //用 "123456" 的子串(2,4) 替换 s1 的子串(1,3)
string s2("Harry Potter");
s2.replace(2, 3, 5, '0'); //用 5 个 '0' 替换子串(2,3)
int n = s2.find("OOOOO"); //查找子串 "00000" 的位置,n=2
s2.replace(n, 5, "XXX"); //将子串(n,5)替换为"XXX"
九、string 字符串的子串删除
erase 成员函数可以删除 string 对象中的子串,返回值为对象自身的引用。
string s1("Real Steel");
s1.erase(1, 3); //删除子串(1, 3),此后 s1 = "R Steel"
s1.erase(5); //删除下标5及其后面的所有字符,此后 s1 = "R Ste"
//string.pop_back()删除字符串最后一个元素
s1.pop_back();
十、string 字符串的子串插入
insert 成员函数可以在 string 对象中插入另一个字符串,返回值为对象自身的引用。
string s1("Limitless"), s2("00");
s1.insert(2, "123"); //在下标 2 处插入字符串"123",s1 = "Li123mitless"
s1.insert(3, s2); //在下标 2 处插入 s2 , s1 = "Li10023mitless"
s1.insert(3, 5, 'X'); //在下标 3 处插入 5 个 'X',s1 = "Li1XXXXX0023mitless"
十一、string 字符串的交换和反转
swap 成员函数可以交换两个 string 对象的内容。
非成员函数swap()、reverse() 实现交换、反转。
//swap 成员函数方法实现两个字符串交换
string s1("West"), s2("East");
s1.swap(s2); // s1 = "East",s2 = "West"
//非成员函数swap(),reverse()
#include<algorithm>
//swap()反转的是两个字符,或者两个整体,比如字符串
//reverse()反转的是整个区间,注意区间前闭后开 即[ )
//reverse()函数用来翻转数组,字符串,向量;
string s1 = "abcde";
string s2 = "fghjk";
swap(s1,s2); //交换字符串s1,s2
swap(s1[0],s1[4]);
reverse(s1.begin(), s1.end()); //反转字符串s1
reverse(&s1[0], &s1[4]); //真实反转的是s1[0]-s1[3],因为前开后闭
reverse(a, a+n); //反转数组a
十二、string 字符串的类型转换、判断
- to_string()——作用是把数值类型如int、double、long等转化为string。
- stoi()——作用是将字符串转化为int型。
- stol()——作用是将字符串转化为long型。
- stoll()——作用是将字符串转化为long long型。
- toupper()、tolower() #include<cctype>
- isalpha()、isalnum()、isdigit()、islower()、isupper()、isblank()、isspace()
str1 = to_string(12345);
n = stoi("1234");
string s1("1234567");
char* s2 = "1234567";
int a = stoi(s1);
int b = atoi(s2);
int c = atoi(s1.c_str()); //atoi的形参是const char*。c_str()的作用是将const string*转化为const char*。
#include<cctpye>
//函数名称 返回值
isalnum(); //如果参数是字母数字,即字母或数字,该函数返回true
isalpha(); //如果参数是字母,该函数返回true
iscntrl(); //如果参数是控制字符,该函数返回true
isdigit(); //如果参数是数字(0~9),该函数返回 true
isgraph(); //如果参数是除空格之外的打印字符,该函数返回 true
islower(); //如果参数是小写字母,该函数返回 true
isprint(); //如果参数是打印字符(包括空格),该函数返回 true
ispunct(); //如果参数是标点符号,该函数返回true
isspace(); //如果参数是标准空白字符,如空格、进纸、换行符、回车、水平制表符或者垂直制表符,该函数返回true
isupper(); //如果参数是大写字母,该函数返回true
isxdigit(); //如果参数是十六进制数字,即0~9、a~f或A~F,该函数返回 true
tolower(); //如果参数是大写字符,则返回其小写,否则返回该参数
toupper(); //如果参数是小写字符,则返回其大写,否则返回该参数
十三、string 字符串的输入
使用 getline(cin, str) 函数来获取 string 输入。
string str;
getline(cin, str, '\0'); //参数1为输入流;参数2为string类型字符串变量名;参数3为截止符,默认为回车键。
/*推荐使用:
cin.get(c)——读取字符,
cin.getline(a, 100, '\0')——读取字符数组,
string::getline(cin, s, '\0')——读取string字符串
*/
//判断文件输入结束,“ctrl+z”表示EOF,即-1
int ch = 0;
while ((ch = getchar()) != EOF) putchar(ch);
//输入什么字母就会输出什么字母,想要退出该程序的运行,就使用快捷键“ctrl + z”即“EOF”,再ENTER结束。
while (scanf("%d", &n) != EOF, n!=-1) //输入-1结束
while (scanf("%d %d", &a, &b) && a!=0 || b!=0) //输入 0 0 结束
char ch;
while (cin >> c) // cin >> c 如果是空的,就会自动返回0(false)
十四、string 字符串的大小写转换
单个字符转换,使用C的toupper、tolower函数实现。
#include <iostream>
#include <string>
using namespace std;
int main(){
string str = "ancdANDG";
cout << "转换前的字符串: " << str << endl;
for(auto &i : str){ //要对i进行修改,必须添加'&'!!!
i = toupper(i); //i = tolower(i); 转大写toupper(),转小写tolower()
}
cout << "转换后的字符串: " << str << endl;
//或者
for(int i = 0;i < str.size();++i){
str[i] = toupper(s[i]);//str[i] = toupper(s[i]);
}
cout << "转换后的字符串: " << str << endl;
return 0;
}
通过STL的transform实现。
一元转换:有4个参数,前2个指定要转换的容器的起止范围,第3个参数是结果存放容器的起始位置,第4个参数是一元运算。
二元转换:有5个参数,前2个指定参与转换的第1个容器的起止范围,第3个参数是转换的第2个容器的起始位置,第4个参数是结果存放容器的起始位置,第5个参数是二元运算。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string str = "helloWORLD";
cout << "转换前:" << str << endl;
//全部转换为大写
transform(str.begin(), str.end(), str.begin(), toupper);
cout << "转换为大写:" << str << endl;
//全部转换为小写
transform(str.begin(), str.end(), str.begin(), tolower);
cout << "转换为小写:" << str << endl;
//前五个字符转换为大写
transform(str.begin(), str.begin()+5, str.begin(), toupper);
cout << "前五个字符转换为大写:" << str << endl;
//后五个字符转换为大写
transform(str.begin()+5, str.end(), str.begin()+5, toupper);
cout << "前五个字符转换为大写:" << str << endl;
return 0;
}
十五、string 字符串的输入输出流
使用流对象 istringstream 和 ostringstream,可以将 string 对象当作一个流进行输入输出。使用这两个类需要包含头文件 sstream。
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string src("Avatar 123 5.2 Titanic K");
istringstream istrStream(src); //建立src到istrStream的联系
string s1, s2;
int n; double d; char c;
istrStream >> s1 >> n >> d >> s2 >> c; //把src的内容当做输入流进行读取
ostringstream ostrStream;
ostrStream << s1 << endl << s2 << endl << n << endl << d << endl << c <<endl;
cout << ostrStream.str();
return 0;
}
/*第 11 行,从输入流 istrStream 进行读取,过程和从 cin 读取一样,只不过输入的来源由键盘变成了 string 对象 src。因此,"Avatar" 被读取到 s1,123 被读取到 n,5.2 被读取到 d,"Titanic" 被读取到s2,'K' 被读取到 c。
第 12 行,将变量的值输出到流 ostrStream。输出结果不会出现在屏幕上,而是被保存在 ostrStream 对象管理的某处。用 ostringstream 类的 str 成员函数能将输出到 ostringstream 对象中的内容提取出来。*/
#根据网络资料整理,主要用于帮助自家孩子的学习。主要参考有:
C++ string类(C++字符串)完全攻略 (biancheng.net)
C++中string类的常用方法实例总结_C 语言_脚本之家 (jb51.net)
(68条消息) c++中string常用用法详解(+例子部分代码)_c++ string类的常用方法_想学好cpp的大学生的博客-CSDN博客