函数toInteger()负责把一个字符串,比如“-719”转换成整数。当函数发现字符串不符合十进制整数的格式要求,比如包含了非数字母,则应放弃转换并抛出一个异常。请实现该函数,使得下述代码能正常运行:当输入为一个合法整数时,转换并打印该整数;当输入为不合法整数时,打印错误信息。
错误信息应为:
illegal integral format
函数接口定义:
int toInteger(const string& s);裁判测试程序样例:
#include <iostream>
using namespace std;
//在此处定义toInteger()函数
int main()
{
try {
string s;
cin >> s;
cout << toInteger(s) << endl;
}
catch (const char* s){
cout << s << endl;
}
return 0;
}输入样例:
+123
输出样例:
123
错误的整数格式举例:
-+123
1+123
--123
1-123-1
答案
#include <cstring>
#include <algorithm>
int toInteger(const string& s)
{
bool T;
int chang=s.length();
auto it=find(s.begin(),s.end(),'+'),he=find(s.begin(),s.end(),'-');
for(int i=0;i<25;i++)
{
char a=97+i,b=65+i;
auto she=find(s.begin(),s.end(),a),she1=find(s.begin(),s.end(),b);
if(she!=s.end()||she1!=s.end())
throw "illegal integral format";
}
if(it!=s.end())
{
if(he!=s.end())
throw "illegal integral format";
else if(distance(s.begin(),it)!=0)
throw "illegal integral format";
else
for(int i=1;i<chang;i++)
{
it=find(s.begin()+i,s.end(),'+');
if(distance(s.begin()+i,it)==0)
throw "illegal integral format";
}
}
else if(he!=s.end())
{
if(it!=s.end())
throw "illegal integral format";
else if(distance(s.begin(),he)!=0)
throw "illegal integral format";
else
{
for(int i=1;i<chang;i++)
{
he=find(s.begin()+i,s.end(),'-');
if(distance(s.begin()+i,he)==0)
throw "illegal integral format";
}
}
}
return stoi(s);
}
我的大体思路就是,使用find函数寻找字符串中的目标字符,并通过目标字符串的位置来判断是否为符合要求的字符串。