substr函数
-
形式:s.substr(pos, n)
-
解释:返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
-
补充:若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s("12345asdf");
string a = s.substr(0,5); //获得字符串s中从第0位开始的长度为5的字符串
cout << a << endl;
}
//输出 12345
stoi函数/atoi函数
atoi和stoi都是只转换字符串的数字部分,遇到其他字符则停止转换。
string s1("1234567");//输出1234567
string s11("+1.1234567");//输出1
char* s2 = "1234567";
int a = stoi(s1);
int b = atoi(s2);
int c = atoi(s1.c_str());
cout << a << endl;
cout << b << endl;
cout << c << endl;
题解
参考柳婼代码
有一点很奇怪:代码第21行int exp=stoi(s.substr(i+1));
中如果是 stoi("-03")
为何输出为 exp=-3
?
#include <bits/stdc++.h>
/*
分析:exp保存E后面的字符串所对应的数字,num保存E前面的字符串,不包括符号位。
当exp<0时表示向前移动,那么先输出0. 然后输出abs(exp)-1个0,然后继续输出num中的所有数字;
当exp>0时候表示向后移动,那么先输出第一个字符,然后将num中尽可能输出exp个字符,
如果num已经输出到最后一个字符(j == num.length())那么就在后面补exp-cnt个0,
否则就补充一个小数点. 然后继续输出num剩余的没有输出的字符~
*/
using namespace std;
int main()
{
string s;
cin>>s;
int i=0;
while(s[i]!='E') i++;
//cout<<i<<endl;
//num:实数 exp:指数
string num=s.substr(1,i-1);
//cout<<num<<endl;
int exp=stoi(s.substr(i+1));
//cout<<exp<<endl;
if(s[0]=='-') cout<<"-";
//当exp<0时表示向前移动
if(exp<0){
//先输出0.
cout<<"0.";
//然后输出abs(exp)-1个0
for(int j=0;j<abs(exp)-1;j++) cout<<'0';
//然后继续输出num中的所有数字
for(int j=0;j<num.length();j++)
if(num[j]!='.') cout<<num[j];
}
//当exp>0时候表示向后移动
else
{
//先输出第一个字符
cout<<num[0];
int cnt,j;
//然后将num中尽可能输出exp个字符
for(j=2,cnt=0;j<num.length()&&cnt<exp;j++,cnt++)
cout<<num[j];
//如果num已经输出到最后一个字符(j == num.length())那么就在后面补exp-cnt个0
if(j==num.length()){
for(int k=0;k<exp-cnt;k++) cout<<'0';
}
//否则就补充一个小数点. 然后继续输出num剩余的没有输出的字符
else{
cout<<'.';
for(int k=j;k<num.length();k++)
cout<<num[k];
}
}
return 0;
}