(十三)string 动态字符串


在以前,我们学习了c++的 字符数组,这次我们还是学字符数组,只不过是动态的字符数组(string),后期我们还会学动态数组(vector)

语法

头文件

string位于和他同名的库中,注意,不是string.hstring是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*/

函数

  1. s[i]s.at(i):返回s的第i项(注意下标从零开始)
  2. s1.append(s2)s1 += s2:拼接s2s1
  3. s[i] = c:替换s[i]c
  4. 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"(不含双引号)
  1. s.length()s.size():返回s的长度
  2. s1.insert(i, s2):将s2插到s1[i]的位置
string s("Hello world!"); 
s.insert(6, "happy "); 
cout << s; //输出"Hello happy world!"(不含双引号)
  1. 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 !"(不含双引号)
  1. 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!"(不含双引号)
  1. 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)
  1. s.begin():返回s首项的指针
  2. s.end():返回s'\0'(尾项加1)的指针
  3. *(it):返回it这个指针指向的变量的值,比如*(s.begin())可以返回s的首项值,*(s.end()-1)可以返回s的尾项的值
  4. reverse(s.begin(), s.end()):颠倒数组(在algorithm头文件中)
  5. s.clear():清空字符串s
  6. s.empty():判断字符串s是不是空的,是返回1,不是返回0

练习

是否回文

输入一个字符串,判断它是否回文

题解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; 
}

请添加图片描述制作不易,点颗心心

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值