C++字符串类<strting>常用使用方法

引言

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博客

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值