本博客依据《c++ Primer Plus (第6版)中文版 》而写。
c++里的string类是对字符串的处理,比c语言的字符串处理好用得多。
string对字符串的处理是对字符串进行类似常量化处理。也就是说,我们可以将一个字符串当成一个常数/常量来进行处理。
首先,使用string必须包含头文件 #include 还要使用命名空间 using namespace std;
基本操作:
1.构造string(构造字符串)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
构造函数 | 描述
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string(const char *s) | 将string对象初始化为s指向的NBTS
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string(size_type n , char c) | 创建一个包含n个元素的string对象,其中每个对象都被初始化为字符c
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string(const string & str) | 将一个string对象初始化为string对象str(复制构造函数)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string() | 创建一个默认的string对象,长度为0(默认构造函数)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string(const char *s , size_type n) | 将string对象初始化为s指向的NBTS的前n个字符,即使超过了NBTS结尾
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
template | 将string对象初始化为区间[ begin , end)内的字符,其中begin和end的行为就像指针
string(Iter begin , Iter end) | ,用于指定特定位置,范围包括begin在内,但不包括end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string(const string &str , string size_type pos = 0,size_type n = npos) | 将一个string对象初始化为对象str中从位置pos开始到结尾
| 的字符,或从位置pos开始的n个字符
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string (string && str) noexcept | 这是c++11新增的,它将一个string对象初始化为string对象str,并可能修改str(移动
| 构造函数)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string(initializer_list il | 这是c++11新增的,它将一个string对象初始化列表il中的字符
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include
#include
using namespace std;
int main()
{
string one("Lottery Winner!");
cout << one << endl;
//构建一个叫 one 的字符串,并将它初始化为"Lottery Winner!"
string two(30,'$');
cout << two << endl;
//构建一个叫 two 的字符串,并将它初始化为由30个$字符组成的字符串
string three(one);
cout << three << endl;
//复制构造函数将string对象three初始化为string 对象 one
one += " Oops!";
cout << one << endl;
//在字符串 one 后面加上"Oops!"(本质是重载了“+=”)
two = "Sorry! That was ";
three[0] = 'p';
string four;
four = two + three;
cout << four << endl;
//将"Sorry! That was "赋给字符串two,将three的第一个字符改为'p',将two 和three的内容加起来赋给字符串four
char alls[] = "All's well that ends well";
string five(alls,20);
cout << five << "!\n";
//将alls的前20个字符赋给five
string six(alls + 6,alls + 10);
cout << six << ", ";
//将alls的从第6个字符开始到第10个字符的内容赋给six
string seven(&five[6],&five[10]);
cout << seven << "...\n";
//将alls的从第6个字符开始到第10个字符的内容赋给seven
string eight(four,7,16); cout << eight << " in motion!" << endl;
//将four的从第7个字符开始到第16个字符的内容赋给eight
return 0;
}
2.字符串的输入:
(1.) 对于C语言版的输入:
char s1[100];
输入方式有3种
a. cin>>s1; 只能读一个word。也就是说遇到空格或者 ‘ \n ’ 就停止了
b. cin.getline(s1,100); 遇到 ' \n ' 停止,可以输入空格,但不包含 ' \n '
c. cin.get(s1,100); 遇到 ' \n ' 停止,但是最后包含 ' \n '
(2.) 对于string的输入:
string s2;
输入方式有2种:
a. cin>>s2; 只能读一个word
b. getline(cin,s2); 遇到 ' \n ' 停止
对于2个版本的getline()输入,都有一种可输入可选参数的方式,用于指定使用那个字符来确定输入的边界:
cin.getline(s1,100,'#'); 表示遇到#号就停止
getline(s2,'#'); 同上
2个版本在功能上的主要区别的,string版本的getline()将自动调整目标string对象的大小,使之刚好能够存储输入的字符,简而言之,就是 string字符串的长度是依据你输入的字符串的长度而定的,你输入多长的字符串它就是多长的长度。而C语言版的是有固定长度的,比如这个例子 的长度是100。 但是string类的输入长度不是无限制的,输入的最大限制是 unsigned int的最大值
string也可以直接比较大小:
s1 == s2; s1 > s2; s1 < s2;
对于string类,下面来个例题:
字符串的冒泡排序 (20分)
我们已经知道了将NNN个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的KKK(<N),输出扫描完第KKK遍后的中间结果序列。
输入格式:
输入在第1行中给出NNN和KKK(1≤K1≤K<N≤100),此后NNN行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。
输出格式:
输出冒泡排序法扫描完第KKK遍后的中间结果序列,每行包含一个字符串。
输入样例:
6 2
best
cat
east
a
free
day
输出样例:
best
a
cat
day
east
free
pat上面的题:如果用string类做,非常简单。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[]) {
string s[101];
int n,k;
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; ++i){
cin>>s[i];
}
for(int i = 1; i <= n; ++i){
if(k == 0) break;
k--;
for(int j = 1; j <= n-i; ++j){
string tmp;
if(s[j] > s[j+1]){
tmp = s[j];
s[j] = s[j+1];
s[j+1] = tmp;
}
}
}
for(int i = 1; i <= n; ++i){
cout<