2016北理上机-字符串中识别数字

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;
/*
输入字符串,输出字符串中包含的数字,比如 2.3ABC0-2.3  输出 2.3 0 -2.3。
注意一些特殊的情况如+004.500值为+4.5。
*/


int main()
{
    string str;     //暂时存储整行
    float a[20];    //存储所有的数字
    getline(cin, str);

    int flag = 0;   //未找到数字
    int count = 0;  //记录数字数目

    float sum = 0;
    float num = 0;
    int f = 0;  //记录是否有过小数点
    int s = 1; //记录小数点后缩小的倍数
    int r = 0;
    for(int i=0; i<str.length()+1; i++){
        //还没有开始记录数字
        char c = str[i];

        //还没开始记录并且为符号并且后一位是数字
        if(c == '-' && str[i+1] >= '0' && str[i+1] <= '9'){
            r = 1;
        }
        //如果是数字
        if(c >= '0' && c <= '9'){
            num = c - '0';
            if(!flag){  //数字的第一位;
                sum = num;
                flag = 1;
            }
            else if(flag && f==0){  //整数位
                sum = sum*10 + num;
            }
            else if(flag && f==1){  //小数位
                s*=10;
                sum = sum + num/s;
            }
        }
        //如果是小数点并且小数点后有数字
        else if(c == '.' && str[i+1]>= '0' && str[i+1] <= '9')
            f = 1;
        else{
            if(flag){
                if(r==1)sum = -sum;
                a[count++] = sum;
                flag = 0;
                sum = 0;
                f = 0;
                s = 1;
                r = 0;
            }
        }
    }

    for(int i= 0; i<count; i++){
        cout << a[i] << ' ';
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值