C++:String(字符串不能撸)

1. String 类

1.1 基本知识

  1. string类是模板类:
typedef basic_string<char> string;
  1. 使用string类要包含头文件<string>
  2. string对象的初始化:
string s1("Hello");
string s2= "Hello";
string s3(8, 'x');	// s3 == "xxxxxxxx"
  1. 错误的初始化:
string error1 = 'c';
string error2('c');
string error3 = 22;
string error4(8);

TIPS:可以将字符赋值给一个string对象

string s;
s = 'c';
  1. 一些操作:

1) length():读取string对象的长度

string s("hello");
cout << s.length() <<endl;

2)string支持流读取运算符(可以通过cin读取string对象,读到空格、换行、’\t’ 停止)

string s;
cin >> s;
  1. string支持getline函数(从cin读取一整行)
string s;
getline(cin, s);
  1. 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中的字符

  1. 查找指定子串:
  • 从前向后找:成员函数find()
string s1("hello world");
s1.find("lo");
//输出: 3
s1.find("ll", 1);
//从下标1开始查找

功能:在s1中从前向后查找,"lo"第一次出现的地方,如果找到,返回"lo"开始的位置,即’l’所在的位置的下标
TIPS:如果找不到,返回string::npos(string中定义的静态常量)

  • 从后往前找:成员函数rfind()
  1. 查找给出字符串中任一字符/ 给出字符串字符以外的任一字符

查找给出字符串中任一字符

  • 首次出现:成员函数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进行输入输出
类似istreamostream进行标准流输入输出,我们用istringstreamostringstream进行字符串上的输入输出,也称为内存输入输出

头文件:

#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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值