qq_43533956
ZEKEGU1997
采纳率75%
2020-01-22 16:16

字符串下标超出范围,哪里出了问题呢

已采纳
#include <iostream>
#include<cstdio>
#include<string>
#include <algorithm>
using namespace std;

void inverse1(string &a)
{//用于翻转整数部分
    int n =a.length();
    int i=0;
    char b;
    while (a[n - 1] == '0'&&n!=1)
    {
        a.erase(n - 1, n);
        n--;
    }
    reverse(a.begin(), a.end());
}

void inverse2(string &a)
{//用于翻转小数部分
    int n = a.length();
    int i = 0;
    char b;
    while (a[0] == '0'&&n!=1)
    {
        a.erase(0, 1);
        n--;
    }
    reverse(a.begin(), a.end());
}

int judge(string x,int l)
{//判断是整数,小数,百分数,分数
    int i=0;
    while (i<l)
    {
        if (x[i] == '.')
            return 1;
        else if (x[i] == '%')
            return 2;
        else if (x[i] == '/')
            return 3;
        i++;
    }
    return 4;
}

int main()
{
    string x,a,b;
    int i = 0,j=0;
    getline(cin,x);
    int l = x.length();
    switch (judge(x,l))
    {
    case 1:
        while (x[i] != '.')
        {
            a[i] = x[i];
            i++;
        }//提取整数部分
        i++;
        while ((i+j)<l)
        {
            b[j] = x[i+j];
            j++;
        }//提取小数部分
        inverse1(a);
        inverse2(b);
        cout << a << '.' << b << endl;
        break;

    case 2:
        while (x[i] != '%')
        {
            a[i] = x[i];
            i++;
        }
        inverse1(a);
        cout << a << '%' << endl;
        break;

    case 3:
        while (x[i] != '/')
        {
            a[i] = x[i];
            i++;
        }
        i++;
        while ((i + j) < l)
        {
            b[j] = x[i + j];
            j++;
        }
        inverse1(a);
        inverse1(b);
        cout << a << '/' << b << endl;
        break;

    case 4:
        inverse1(x);
        cout << x << endl;
        break;
    }
    return 0;
}

题目如下:
这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答