pta6-5 错误的十进制整数

函数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函数寻找字符串中的目标字符,并通过目标字符串的位置来判断是否为符合要求的字符串。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值