Contest100000598 - 《算法笔记》6.3小节——C++标准模板库(STL)介绍->string的常见用法详解

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()。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李霁明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值