Contest100000598 - 《算法笔记》6.3小节——C++标准模板库(STL)介绍->string的常见用法详解
6.3 string的常见用法详解
1. string的定义
2. string中内容的访问
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main()
{
//###-1-string定义
string str = "abcd";
// cout<<"str初始化为:"<<str<<endl;
printf("str初始化为:%s\n",str.c_str());//将string使用c_str()变为字符数组
//###-2.1-按下标访问
cout<<"按下标访问如下:"<<endl;
for(int i=0;i < str.length();i++){
printf("%c",str[i]);
}
cout<<endl;
//###-2.2-通过迭代器访问
cout<<"通过迭代器访问如下:"<<endl;
for(string::iterator it = str.begin();it != str.end();it++){
printf("%c",*it);
}
cout<<endl;
return 0;
}
3. string常用函数实例解析
(1)operator+=
(2)compare operator
(3)length()/size()
(4)insert()
(5)erase()
(6)clear()
(7)substr()
(8)string::npos
(9)find()
(10)replace()
string函数整合代码
//string操作
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main()
{
//###-1-operator+=
string str1 = "abc",str2 = "xyz",str3;
cout<<"str1为:"<<str1<<endl;
cout<<"str2为:"<<str2<<endl;
cout<<"str3为:"<<str3<<endl;
str3 = str1+str2;
str1 += str2;
cout<<"由str1 += str2可得str1为:"<<str1<<endl;
cout<<"由str3 = str1+str2可得str3为:"<<str3<<endl;
cout<<endl;
//###-2-compare operator
str1 = "aa";str2="aaa";str3="abc";string str4="xyz";
if(str1 < str2) printf("ok1\n");
if(str1 != str3) printf("ok2\n");
if(str4 >= str3) printf("ok3\n");
cout<<endl;
//###-3-length()/size()
str1 = "abcxyz";
cout<<"abcxyz字符串长度为:"<<endl;
printf("%d %d\n",str1.length(),str1.size());
//###-4-insert()
str2 = "opq";//insert(pos,string)
str1.insert(3,str2);
cout<<"abcxyz字符串第三个位置插入opq字符串后变为:"<<str1<<endl;
str1.insert(str1.begin()+3,str2.begin(),str2.end());//insert(it,it2,it3)
cout<<"abcopqxyz字符串第三个位置插入opq字符串后变为:"<<str1<<endl;
//###-5-erase()
str1.erase(str1.begin()+3);//str.erase(it)删除4号位o
cout<<"abcopqopqxyz字符串删除第四个位置o字符串后变为:"<<str1<<endl;
str1.erase(str1.begin()+3,str1.end()-3);//str.erase(first,last)
cout<<"abcpqopqxyz字符串删除第4~8位置字符后变为:"<<str1<<endl;
str1.erase(3,3);//str.erase(ipos,length)
cout<<"abcxyz字符串删除从第4位置开始的3个字符后变为:"<<str1<<endl;
//###-6-clear()
str1.clear();
cout<<"abc字符串clear()后变为:"<<str1<<endl;
//###-7-substr()
str1 = "abcxyz";
cout<<"abcxyz字符串从下标2开始长度为3的子串为:"<<str1.substr(2,3)<<endl;
//###-8-string::npos
//string::npos==-1或4294967295
//###-9-find()
str1 = "abcxyz",str2="xyz";
cout<<"xyz子串在abcxyz中第一次出现的位置为:"<<str1.find(str2)<<endl;
//###-10-replace()
str1 = "Maybe you will turn around.";
str2 = "will not";str3 = "surely";
cout<<"Maybe you will turn around.字符串从第10位开始的4位替换为str2后为:";
cout<<str1.replace(10,4,str2)<<endl;
cout<<"Maybe you will not turn around.字符串从起始位开始的5位替换为str3后为:";
cout<<str1.replace(str1.begin(),str1.begin()+5,str3)<<endl;
return 0;
}
PAT习题-PAT-A1060-Are They Equal
链接:
https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872
//PAT习题-PAT-A1060-Are They Equal
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int n;//有效位数
string deal(string s,int& e){//对原始数据处理,将前导0、小数点、第一个非零位前的0全删除
int k = 0;//s的下标
while(s.length() > 0 && s[0] == '0'){
s.erase(s.begin());//去掉s的前导0
}
if(s[0] == '.'){//s是小于1的小数
s.erase(s.begin());//去掉小数点
while(s.length() >0 && s[0] == '0'){
s.erase(s.begin());//去掉小数点后非零位前的所有0
e--;//每去掉一个0,指数e减1
}
}
else{//去掉前导0后不是小数点,则找到后面的小数点删除
while(k < s.length() && s[k] != '.'){//寻找小数点
k++;
e++;//指数递增
}
if(k < s.length()){//while结束后k < s.length(),说明碰到了小数点
s.erase(s.begin()+k);//删除小数点
}
}
if(s.length() == 0){
e = 0;
}
int num = 0;
k = 0;
string res;
while(num < n){//只要精度还没有到n
if(k < s.length()) res += s[k++];//数字加到res末尾
else res += '0';//否则res末尾添0
num++;//精度加1
}
return res;
}
int main()
{
string s1,s2,s3,s4;
cin>>n>>s1>>s2;
int e1 = 0,e2 = 0;//e1、e2为s1和s2的指数
s3 = deal(s1,e1);
s4 = deal(s2,e2);
if(s3 == s4 && e1 == e2){//主体相同且指数相同则YES
cout<<"YES 0."<<s3<<"*10^"<<e1<<endl;
}
return 0;
}
Codeup习题
Contest100000598 - 《算法笔记》6.3小节——C++标准模板库(STL)介绍->string的常见用法详解
链接:http://codeup.cn/contest.php?cid=100000598
1983-Problem-A-字符串处理
链接:http://codeup.cn/problem.php?cid=100000598&pid=0
//@@@@1983-Problem-A-字符串处理
//@@@@求两字符串相加,按指定格式输出
//@@@@网上大神的代码,我结合自己的思考进行注释与修改
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
int main(){
char str1[50],str2[50];
long long s,s1,s2,ans;
int i,a1,a2,a,b,c,w,flag;
while(scanf("%s %s",str1,str2) != EOF){
//输入str1将其转化为数字
s1 = s2 = flag = b = c = a1 = 0;
for(i = 0;str1[i];i++){
if(str1[i] == '-'){//负号检测
flag = 1;
}
else if(str1[i] == '.'){//浮点小数点检测
c = 1;
}
else if(str1[i] == 'e' || str1[i] == 'E'){//指数符号检测
sscanf(str1+i+1,"%d",&b);//将指数开始的位置提取
a1 += b;//指数阶数赋值给a1
break;
}
else{//否则,按照正常的字符串元素处理,将字符转换为数字
s1 = s1*10 + str1[i] - '0';
a1 -= c;//如果有小数点,则s1增大一次则a1减小1
}
}
if(flag) s1 = -s1;//如果有负号,则转化为绝对值的相反数
//同理输入str2将其转化为数字
flag = b = c = a2 = 0;
for(i = 0;str2[i];i++){
if(str2[i] == '-'){
flag = 1;
}
else if(str2[i] == '.'){
c = 1;
}
else if(str2[i] == 'e' || str2[i] == 'E'){
sscanf(str2+i+1,"%d",&b);
a2 += b;
break;
}
else{
s2 = s2*10 + str2[i]-'0';
a2 -= c;
}
}
if(flag) s2 = -s2;
//对阶
if(a1 < a2){
for(;a1<a2;a2--){
s2 *= 10;
}
}
else if(a1 > a2){
for(;a1 > a2;a1--){
s1 *= 10;
}
}
//求和
a=a1;s=s1+s2;
if(!s){ //两数之和为0
printf("0\n");
continue;
}
while(a<0 && s%10 == 0){
s /= 10;
a++;//找到a的小数点位置
}
if(a >= 0){
printf("%lld",s);
for(i = 0;i<a;i++){
printf("0");
}
printf("\n");
continue;
}
flag = 0;
//判断和数的符号
if(s<0){
s = -s;
flag = 1;
}
ans = 1;w = 0;
//求和数的
while(ans <= s){
ans *= 10;
w++;
}
if(ans > 1){
ans /= 10;
w--;
}
//输出和数
if(flag){
printf("-");
}
printf("%lld",s/ans);//整数部分
if(ans > 1){
printf(".%lld",s%ans);
}
printf("e%d\n",a + w);
}
return 0;
}
小结
string类型很重要,是字符流和数字中转的接口;其中其主要操作为operator+=、compare operator、length()/size()、insert()、erase()、clear()、substr()、string::npos、find()、replace()。