易错点
实现前导0的删除:如 0002 转为 2
错误代码:
string s;
cin>>s;
for(int x=0;x<s.size();x++)//去掉前导0
{
if(s[x]=='0') s.erase(s.begin()+x);
else break;
}
错因:s在erase时,其长度发生变化,erase第x位时,x+1,x+2…都会向前移一位。
正确代码:
string s;
cin>>s;
for(int x=0;x<s.size();x++)//去掉前导0
{
if(s[x]=='0') {s.erase(s.begin()+x);x--;}
else break;
}
因此,我们要使用for(int i=0;i<s.size();i++){ 对s操作 } 不管是replace还是erase,要注意指向字符串s的指针是会发生变化的。
sstream
添加头文件sstream
数字转字符串
范例程序:
#include<iostream>
#include<sstream>
using namespace std;
void num2str(int num,string &str)
{
stringstream ss;
ss<<num;
ss>>str;
}
int main()
{
string str;
num2str(2,str);
cout<<str;
}
字符串转数字
#include<iostream>
#include<sstream>
using namespace std;
void str2num(int &num,string str)
{
stringstream ss;
ss<<str;
ss>>num;
}
int main()
{
int num;
str2num(num,"1234");
cout<<num;
}
读入一行数据并存入数组中
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num;
string str;
vector<string> v;
cin>>num;
getchar();//后面使用getline需要先吃掉cin后面的空格
getline(cin,str);
stringstream ss(str);
while(ss>>str) v.push_back(str);
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<endl;
}
}
读入一个字符串中每一个字符
#include<bits/stdc++.h>
using namespace std;
int main()
{
string start="";
for(int i=0;i<9;i++)
{
char c;
cin>>c;
start+=c;
}
cout<<start;
}
大小写相互转换
tolower()函数和toupper函数
#include<iostream>
#include<cstring>
using namespace std;
string low(string str)
{
string res;
for(int i=0;i<str.size();i++)
{
res+=tolower(str[i]);
}
return res;
}
string upper(string str)
{
string res;
for(int i=0;i<str.size();i++)
{
res+=toupper(str[i]);
}
return res;
}
int main()
{
string str="AbcdefG";
cout<<low(str)<<endl;
cout<<upper(str)<<endl;
}
要使用printf打印string类型
#include<bits/stdc++.h>
using namespace std;
int main(){
string a="nihao";
printf("%s",a.c_str());
return 0;
}