平时在刷题的时候总是会遇到数字与字符串怎么转换的问题,我们要是用一般的方法。
字符串变成数字的常规套路
秦九昭算法
res=res*进制+每一位的数字(从高位向低位)
string a;
int res=0;
for(int i=0;i<a.length();i++)
res=res*10+a[i]-'0';
数字变字符串。
这是把数字19234变字符串的方法
#include<iostream>
#include<algorithm>
using namespace std;
int main(void)
{
int s=19234;
string a;
while(s)
{
a+=s%10+'0';
s/=10;
}
reverse(a.begin(),a.end() );
cout<<a;
}
数字变成字符串的方法用到了reverse的函数,我觉得这样下来代码量也是很大,不值得去使用,我们有没有更简单的方法呢,是有的。
然后在寒假的前十天,我们学了一个网课,我们了解到了一个很好的一个解决办法,叫字符串流。
stringstream 这个变量名
然后这个在sstream的头文件当中,我们应该如何使用呢。
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
int main(void)
{
string a="19235";
int digit;
stringstream ss;
ss<<a;
ss>>digit;
cout<<digit;
}
注意事项
原字符串不能有空格,如果出现空格
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
int main(void)
{
string a="192 35";
int digit;
stringstream ss;
ss<<a;
ss>>digit;
cout<<digit;
}
我们做题的时候,可能会出现一些这样的情况
例题AcWing 1204. 错误票据
让你输入每行的数字,我们又不知道有多少个的时候。
我们可以用到这个stringstream
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
const int N=1e5+10,Inf=1e7;
int st[N];
int main(void)
{
int i=0;
int n;
scanf("%d\n",&n);
cout<<n<<endl;
string a;
while(getline(cin,a))
{
stringstream ss(a);
i=0;
while(ss>>st[i]) i++;
for(int j=0;j<i;j++)
printf("%4d ",st[j]);
puts("");
}
}
我们可以观察到每一个数都输出来了,然后我们怎么使用呢。
一、预处理,我们要用到sstream的头文件。
#include<sstream>
二、初始化
stringstream ss;
如果是这种形式的话
stringstream ss(a);
等同于
stringstream ss;
ss<<a;
这是两种初始化的方法。
三、
int digit;
double digi;
float dig;
选择你要变换数字的类型。
ss>>digit;
ss>>digi;
ss>>dig;
实现转化,我们在这个时候先说一下,ss>>digit转换的时候,如果不成功会返回0.
于是我们可以实现这样的过程。
while(ss>>digit[i]) i++;
把ss保存的多个数保存在digit数组里
这样就是我们需要学会的stringstream的用法。
持续更新本文种~~,下一步介绍sscanf的用法以及ssprintf的用法