前提要示: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 型)