String 类 --总结

前提要示:C++的 string类 和 C语言的<string.h>半点关系也没有,标准库类型 string 表示可变长的字符串,而<string.h>是旧C 的头文件,对应的是基于char*的字符串处理函数,所以 string类 并非<string.h>的“升级版本”,他们是毫无关系的两个头文件,而C++的< cstring >才是对应于旧C <string.h>的std 版本 详细说明点击此

1、初始化 string 对象

常用方式

string val;           //默认初始化,val是空字符
string val2 = val;	   //val2也是空字符
string val3 = "well";  //val3的内容与该字面值一样
string val4(5,'c')	   //内容是"ccccc"

特殊用法

string val5(val3);   //val3的内容是"well"
string val6("well"); //val7的内容也是"well"

顺便一提

string val3 = "well";
val3 = "Allright";   //当声明完 string类后要改定义的话可以直接改

2、打印 string 对象

One、普通打印

string val = "   Hello World   "
cout<< val <<endl;

output:Hello

原因:在打印操作时, string 对象会自动跳过开头的空白(包括空格符、换行符、 Tab键等)并从第一个字符读起,直到遇到下一处空白为止

Two、使用getline读取一整行

string line;
while (getline(cin,line))//每次读一整行直到文件末尾
	cout<< line << endl;
return 0;

解析:用getline的好处是遇到空白不会停止,直到换行符才停止读取,并且得到的line实际上是不包含换行符的

3、string::size_type类型

size()函数返回是string::size_type类型的值,string::size_type它是一个无符号类型的值,而且能够存放下任何string对象的大小。另外,string类型的索引也是一个size_type类型的(如:下标运算符 [ ] 索引的就是string::size_type类型)

还有:虽然书上说不要把string::size_type类型和unsigned型与int型混杂,但我觉得还是可以把string::size_type类型简单的理解为:无穷大的unsigned型

4、比较两个字符串(string对象)是否相等

先建议大家看一下 c\c++中比较两个字符串或string对象是否相等(一定要看哦!)

然后我针对这篇文章做个概述:

One、如果要比较的对象是char*字符串,且用 “==” 符号比较,那么比较的是两个字符串的地址是否相等(相等是1,不等是0

Two、如果要比较的对象是char*字符串,且利用strcmp()函数比较,那么比较的是两个字符串的ASCII码(相等是0,不等是1

Three、 如果要比较的对象是两个string,且利用compare()函数比较,那么比较的是两个字符串的ASCII码相等是1,不等是0

Four、 如果要比较的对象是两个string且用 “==” 符号比较,那么比较的是两个字符串的ASCII码相等是0,不等是1

5、string 对象相加

可以两个 string对象 相加,也可以把 string对象 和字符串字面值混加,但对于第二种情况有个前提:必须确保每个加分运算符(+)的两侧的运算对象至少有一个是 string

string val1 = "123";
string val2 = "456";
string val3 = val1 + "789" + val2 //正确
string val4 = "789" + val1 + "789" //错误
string val5 = (val1 + "789") + "789" //正确,因为括号内相加后是string

string对象 还有一种加法,即 append 的用法(一般用于补齐 或 插入特定长度)

string a, b;
cin >> a >> b;
int lena = a.length(), lenb = b.length();
if (lena > lenb) //若 a 比 b 长,就补齐 b
	b.append(lena - lenb, '0'); //第一个参数是个数,第二个参数是补充的字符
cout << b;

input:12345 123
output:12300

string a = "48", b = "88";
b.append(a, 0, 2); //第二个参数是插入起始下标,第二个参数是插入个数
cout << b;

output:8848

6、字符串复制

substr( 开始,长度),相当于复制,举例如下:

// 从下标为 0 处复制 s2 的三个字符给 s1
string s1 = s2.substr(0, 3);

// 从下标为 2 处复制 s2 剩下的所有字符给 s1
string s1 = s2.substr(2);

补充:对于 char*字符串,strcpy(str1,str2),将 str2 中的字符复制到 str1 中

7、除去前导符号

//如为整型除去前导 0
s.erase(0,s.find_first_not_of('0'));

8、统计在一定范围内某一值出现的次数(count)

string s = "101101110";
int num = count(s.begin(), s.end(), '0');

output: 3

9、插入字符串

string a = "123";
string b = "456";
string c = "789";

a.insert(3,b);
cout << a << endl;
a.insert(6,c,0,1);
cout << a;

output:
123456
1234567

10、查询字符串

string a = "0123456";
if (a.find("23")==string::npos) cout<<"没找到";
else cout << a.find("23");  //返回第一次出现时的元素下标

output:
2

//补充: a.find("23",2) 的意思是从下标为二的元素开始查找,要是找不到则返回 -1
//补充: string::npos == -1

11、基于范围的 for 语句(auto)

int main()
{
	string str("some");
	for (auto c : str)//每行输出str的一个字符
		cout << c << endl;
	return 0;
}

output:s
	   o
	   m
	   e

12、String 以 C 的形式输出

作用:将 C++ 的 string 转化为 C 的字符串数组输出

string temp = "123";
printf("%s",temp.c_str());

//这样就可以将 temp 以 c语言 的形式输出(目的是为了快)
output:123

13、stringstream(字符串流)

stringstream 的作用是可以很方便的实现 各种数据类型的转换

// 题目
//所给数据中每行含若干个(至少一个)以空格隔开的整数,输出每行的整数之和

//example
45 45
90
13 12
25

0

/* 伪代码 */
string line;
while(getline(cin,line))
{
	int sum = 0,x;
	stringstream ss(line);
	/*
    while (1)
    {
        ss >> x;
        if (ss.fail()) break;
        sum += x;
    }
	*/
	while(ss >> x)
		sum += x;
	cout << sum << "\n";
}
// 题目
//运用 sstream 接收一段数据,再输出到不同类型上并打印

/* 伪代码 */
string num="100";
stringstream ss;
char a[10];
int b;
ss.clear();
ss<<num;
ss>>a;
ss.clear();
ss.str(num);
ss>>b;
cout<<a<<' '<<b;

output: 100 100

stringstream ss(line) 读取参数 line 到流 ss 中(只能读取 string )
ss.str(num) 读取参数 num 到流 ss 中(只能读取 string )
ss << num 读取参数 num 到流 ss 中(能读取 string 与 int 型)
ss.fail() 若读取到流的结尾则返回 true,否则返回 false
ss.clear() 清空流
s >> 将流输出到对应参数中(参数包括 string 、char * 型 与 int 型)

14、字符串(string、char*) 与 数字(int) 相互转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值