在以前,我们学习了c++的 字符数组,这次我们还是学字符数组,只不过是动态的字符数组(string),后期我们还会学动态数组(vector)
语法
头文件
string
位于和他同名的库中,注意,不是string.h
,string
是c++STL(Standard Template Library)的库,而string.h
是c语言的库
#include <string>
定义
定义字符串十分简单,见下代码
string s; //定义一个空字符串
string s{"Str"}; //定义一个内容为Str的字符串
string s("Str"); //和第二行一样
string s = "Str"; //和第二行一样
输入 & 输出
cin >> s; //输入字符串
cout << s; //输出字符串
getline(cin, s, 'C'); //输入字符串s,到C截止输入(不填默认为换行)
/*别想用scanf输入字符串,老实一点*/
/*别想用printf输出字符串,使用cout多方便*/
/*别想用gets时输入字符串,使用人家getline*/
/*别想用fgets输入字符串,使用getline*/
函数
s[i]
或s.at(i)
:返回s
的第i
项(注意下标从零开始)s1.append(s2)
或s1 += s2
:拼接s2
到s1
s[i] = c
:替换s[i]
为c
s.substr(i, t)
:返回从s[i]
开始,数t
项的子字符串,不填表示数到结尾
string s("Hello World! ");
/*字符串:H e l l o W o r l d ! \0 */
/* 索引:0 1 2 3 4 5 6 7 8 9 10 11 12 */
/* 截取(substr): 1 2 3 4 5 */
s.substr(6, 5); //输出"World"(不含双引号)
s.length()
或s.size()
:返回s
的长度s1.insert(i, s2)
:将s2
插到s1[i]
的位置
string s("Hello world!");
s.insert(6, "happy ");
cout << s; //输出"Hello happy world!"(不含双引号)
s.erase(i, t)
:从s[i]
开始,往后删除t
个字符,不填表示删除从s[i]
开始后的所有字符
string s("Hello World! ");
/*字符串:H e l l o W o r l d ! \0 */
/* 索引:0 1 2 3 4 5 6 7 8 9 10 11 12 */
/* 截取(erase): 1 2 3 4 5 */
s.erase(6, 5);
cout << s; //输出"Hello !"(不含双引号)
s1.replace(i, t, s2)
:从s1[i]
开始,往后数t
位,替换为s2
string s("Hello World! ");
/*字符串:H e l l o W o r l d ! \0 */
/* 索引:0 1 2 3 4 5 6 7 8 9 10 11 12 */
/* 截取(replace): 1 2 3 4 5 */
s.replace(6, 5, "everyone");
cout << s; //输出"Hello everyone!"(不含双引号)
s1.find(s2, beg, end)
:在s1[beg]
到s1[end]
的范围内查找s2
的位置,查找不到返回string::npos
,不填后两项值表示全局搜索
string s("Hello World! ");
/*字符串:H e l l o W o r l d ! \0 */
/* 索引:0 1 2 3 4 5 6 7 8 9 10 11 12 */
cout << s.find("World"); //输出6
cout << s.find("Word"); //输出-1(也就是string::npos)
s.begin()
:返回s
首项的指针s.end()
:返回s
中'\0'
(尾项加1)的指针*(it)
:返回it
这个指针指向的变量的值,比如*(s.begin())
可以返回s
的首项值,*(s.end()-1)
可以返回s
的尾项的值reverse(s.begin(), s.end())
:颠倒数组(在algorithm
头文件中)
练习
是否回文
输入一个字符串,判断它是否回文
题解1
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
string t(s);
reverse(t.begin(), t.end()); //翻转后检测
cout << (s==t?"Yes":"No");
return 0;
}
题解2
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
for(int i=0; i<s.length()/2; i++) {
if(*(s.begin()+i)!=*(s.end()-1-i)) {//迭代器逐位检测
cout << "No";
return 0;
}
}
cout << "Yes";
return 0;
}
题解3
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
for(int i=0; i<s.length()/2; i++) {
if(s[i]!=s[s.length()-1-i]) {//逐位检测
cout << "No";
return 0;
}
}
cout << "Yes";
return 0;
}
题解4
这是后期的做法,现在可以不看
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
if(s.size()%2) s.erase(s.size()/2, 1);
stack<char> T; //定义字符栈
for(int i=0; i<s.size(); i++) {
if(!T.empty()&&T.top()==s[i]) //匹配
T.pop(); //成功消栈顶
else
T.push(s[i]); //失败放入栈
}
cout << (T.empty()?"Yes":"No"); //判断是否匹配成功
return 0;
}
制作不易,点颗心心