读取字符串时出错,为什么?

编译不报错,但是运行的时候又是运行不下去,不输出结果,我设断点找说是因为“读取字符串时出错”但我搞不清原因
#include <iostream>
using namespace std;
void fun1();
void fun2();
void fun3();
void fun4();
void input16(char a[], char b[], int* s);
void input2810(char a[], char b[], int m, int n, int* s);
void trans10(char a[], char b[], int* s, int h);
void trans(char a[], char b[], int* s, int h);
void trans(char a[], char b[], int* s);
int main()
{
    cout << "**********************" << endl;
    cout << "一级菜单:" << endl;
    cout << "(1)2进制数转换" << endl;
    cout << "(2)8进制数转换" << endl;
    cout << "(3)10进制数转换" << endl;
    cout << "(4)16进制数转换" << endl;
    cout << "(0)退出" << endl;
    cout << "**********************" << endl << endl;
    int fn = 1;
    while (fn)
    {
        cout << "输入功能号:";
        cin >> fn;
        if (fn > 0 && fn < 5)
            switch (fn)
            {
            case 1:
                fun1();
                break;
            case 2:
                fun2();
                break;
            case 3:
                fun3();
                break;
            default:
                fun4();
                break;
            }
        else if (fn == 0)
        {
            cout << endl << "已退出" << endl << endl;
            break;
        }
        else
            cout << "功能号输入错误,请重新";
    }
    return 0;
}
void fun1()                                                 //2进制数转换
{
    cout << "*****************************" << endl;
    cout << "二级菜单:" << endl;
    cout << "(1)2进制数  --->  8进制数" << endl;
    cout << "(2)2进制数  --->  10进制数" << endl;
    cout << "(3)2进制数  --->  16进制数" << endl;
    cout << "(0)返回上级目录" << endl;
    cout << "*****************************" << endl;
    int Fn = 1;
    while (Fn)
    {
        cout << endl << "输入功能号:";
        cin >> Fn;
        if (Fn > 0 && Fn < 4)
            switch (Fn)
            {
            case 1:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 49, s);
                trans10(a, b, s, 2);
                trans(a, b, s, 8);
                break;
            }
            case 2:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 49, s);
                trans10(a, b, s, 2);
                if (*s == 1)
                    cout << "-";
                if (a[0] == '\0')
                    cout << "0";
                else
                    cout << a;
                if (b[0] != '\0')
                {
                    cout << "." << b;
                }
                break;
            }
            default:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 49, s);
                trans10(a, b, s, 2);
                trans(a, b, s, 16);
                break;
            }
            }
        else if (Fn == 0)
            main();
        else
            cout << "功能号输入错误,请重新";
    }
}
void fun2()                                                   //8进制数转换
{
    cout << "*****************************" << endl;
    cout << "二级菜单:" << endl;
    cout << "(1)8进制数  --->  2进制数" << endl;
    cout << "(2)8进制数  --->  10进制数" << endl;
    cout << "(3)8进制数  --->  16进制数" << endl;
    cout << "(0)返回上级目录" << endl;
    cout << "*****************************" << endl;
    int Fn = 1;
    while (Fn)
    {
        cout << endl << "输入功能号:";
        cin >> Fn;
        if (Fn > 0 && Fn < 4)
            switch (Fn)
            {
            case 1:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 55, s);
                trans10(a, b, s, 8);
                trans(a, b, s, 2);
                break;
            }
            case 2:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 55, s);
                trans10(a, b, s, 8);
                if (*s == 1)
                    cout << "-";
                if (a[0] == '\0')
                    cout << "0";
                else
                    cout << a;
                if (b[0] != '\0')
                {
                    cout << "." << b;
                }
                break;
            }
            default:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 55, s);
                trans10(a, b, s, 8);
                trans(a, b, s, 16);
                break;
            }
            }
        else if (Fn == 0)
            main();
        else
            cout << "功能号输入错误,请重新";
    }
}
void fun3()                                                  //10进制数转换
{
    cout << "*****************************" << endl;
    cout << "二级菜单:" << endl;
    cout << "(1)10进制数  --->  2进制数" << endl;
    cout << "(2)10进制数  --->  8进制数" << endl;
    cout << "(3)10进制数  --->  16进制数" << endl;
    cout << "(0)返回上级目录" << endl;
    cout << "*****************************" << endl;
    int Fn = 1;
    while (Fn)
    {
        cout << endl << "输入功能号:";
        cin >> Fn;
        if (Fn > 0 && Fn < 4)
            switch (Fn)
            {
            case 1:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 57, s);
                trans(a, b, s, 2);
                break;
            }
            case 2:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 57, s);
                trans(a, b, s, 8);
                break;
            }
            default:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input2810(a, b, 48, 57, s);
                trans(a, b, s);
                break;
            }
            }
        else if (Fn == 0)
            main();
        else
            cout << "功能号输入错误,请重新";
    }
}
void fun4()                                                   //16进制数转换
{
    cout << "*****************************" << endl;
    cout << "二级菜单:" << endl;
    cout << "(1)16进制数  --->  2进制数" << endl;
    cout << "(2)16进制数  --->  8进制数" << endl;
    cout << "(3)16进制数  --->  10进制数" << endl;
    cout << "(0)返回上级目录" << endl;
    cout << "*****************************" << endl;
    int Fn = 1;
    while (Fn)
    {
        cout << endl << "输入功能号:";
        cin >> Fn;
        if (Fn > 0 && Fn < 4)
            switch (Fn)
            {
            case 1:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input16(a, b, s);
                trans10(a, b, s, 16);
                trans(a, b, s,2);
                break;
            }
            case 2:
            {
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input16(a, b, s);
                trans10(a, b, s, 16);
                trans(a, b, s, 8);
                break;
            }
            default:
            {   
                char a[20], b[20];
                int* s;
                int p = 0;
                s = &p;
                input16(a, b, s);
                trans10(a, b, s, 16);
                if (*s == 1)
                    cout << "-";
                if (a[0] == '\0')
                     cout << "0";
                else
                    cout << a;
                if (b[0] != '\0')
                {
                    cout << "." << b;
                }
                break;
            }
            }
        else if (Fn == 0)
            main();
        else
            cout << "功能号输入错误,请重新";
    }
}
void input2810(char a[], char b[], int m, int n, int* s)          //检测并输入2810进制数
{
    int J = 1, B = 0;
    while (J)
    {
        cout << "输入原进制数:";
        char x[20];
        cin >> x;
        char* p = x;
        int i = 0;
        if (*p == '-')
        {
            *s = 1;       //该数用于判断原进制数是否为负数(s==1)
            i = 1;
        }
        int len = strlen(x);
        int j = 0, k = 0;
        if (*(p + i) == '.')       //排除第一个字符等于‘.’的情况
        {
            cout << "输入有误,请重新";
            input2810(a, b, m, n, s);
            break;
        }
        for (i; i < len; i++)
        {
            if (*(p + i) >= m && *(p + i) <= n)
            {
                a[j] = *(p + i);        //得到整型常量
                a[j + 1] = '\0';
                j++;
            }
            else if (*(p + i) == '.')
            {
                i++;
                break;
            }
            else
            {
                cout << "输入有误,请重新";
                input2810(a, b, m, n, s);
                B = 1;
                break;
            }
        }
        if (B == 1)
            break;              //防止继续执行下面的代码
        b[0] = '\0';
        for (i; i < len; i++)
        {
            if (*(p + i) >= m && *(p + i) <= n)
            {
                b[k] = *(p + i);
                b[k + 1] = '\0';
                k++;
            }
            else
            {
                cout << "输入有误,请重新";
                input2810(a, b, m, n, s);
                break;
            }
        }
        break;
    }
}
void input16(char a[], char b[], int* s)                                 //检测并输入16进制数
{
    int J = 1, B = 0;
    while (J)
    {
        cout << "输入原进制数:";
        char x[20];
        cin >> x;
        char* p = x;
        int i = 0;
        if (*p == '-')
        {
            *s = 1;                 //该数用于判断原进制数是否为负数(s==1)
            i = 1;
        }
        int len = strlen(x);
        int j = 0, k = 0;
        if (*(p + i) == '.')                 //排除第一个字符等于‘.’的情况
        {
            cout << "输入有误,请重新";
            input16(a, b, s);
            break;
        }
        for (i; i < len; i++)
        {
            if (*(p + i) >= 48 && *(p + i) <= 57)
            {
                a[j] = *(p + i);
                a[j + 1] = '\0';
                j++;
            }
            else if (*(p + i) >= 65 && *(p + i) <= 70)
            {
                a[j] = *(p + i) - 7;         //A是10
                a[j + 1] = '\0';
                j++;
            }
            else if (*(p + i) == '.')
            {
                i++;
                break;
            }
            else
            {
                cout << "输入有误,请重新";
                input16(a, b, s);
                B = 1;
                break;
            }
        }
        if (B == 1)
            break;             //防止继续执行下面的代码
        b[0] = '\0';
        for (i; i < len; i++)
        {
            if (*(p + i) >= 48 && *(p + i) <= 57)
            {
                b[k] = *(p + i);
                b[k + 1] = '\0';
                k++;
            }
            else if (*(p + i) >= 65 && *(p + i) <= 70)
            {
                b[k] = *(p + i) - 7;
                b[k + 1] = '\0';
                k++;
            }
            else
            {
                cout << "输入有误,请重新";
                input16(a, b, s);
                break;
            }
        }
        break;
    }
}
void trans10(char a[], char b[], int* s, int h)                            //h-->10(h为原进制数)
{
    long double num1 = 0;
    double k = 1.0;
    int len1 = strlen(a);
    for (int i = len1 - 1; i >= 0; i--)
    {
        num1 = num1 + k * (a[i] - '0');
        k = k * h;
    }
    k = 1.0 / h;
    long double num2 = 0;
    if (b[0] != '\0')
    {
        int len2 = strlen(b);
        for (int i = 0; i < len2; i++)
        {
            num2 = num2 + k * (b[i] - '0');
            k = k / h;
        }
    }
    if (num1 == 0)
        a[20] = {'0'};
    else
    {
        int w = num1 / 10;
        int W=0;
        while (w != 0)
        {
            W++;
            w = num1 / 10;
        }
        int k = 1;
        for (int i = 0; i < W; i++)
            k = k * 10;
        for (int i = 0; i < W + 1; i++)
        {
            a[i] = num1 / k + '0';
            a[i + 1] = '\0';
            k = k / 10;
        }
    }
    if (num2 == 0)
        b[20] = {'0'};
    else
    {
        int w , i = 0;
        while (num2 != 0)
        {
            num2 = num2 * 10;
            w = num2 ;
            num2 = num2 - w;
            b[i] = w + '0';
            b[i+1]= '\0';
            i++;
        }
    }
}
void trans(char a[], char b[], int* s, int h)                                 //10-->2,8
{
    int len1 = strlen(a);
    int len2 = strlen(b);
    long m = 0, k = 10;
    long double n = 0;
    for (int i = 0; i < len1; i++)
        m = k * m + (long)(a[i] - '0');
    if (b[0] != '\0')
        for (int i = 0; i < len2; i++)
        {
            n = n + (double)(b[i] - '0') / k;
            k = k * 10;
        }
    k = 1;
    long x = 0;
    long double y = 0;
    while (m != 0)
    {
        x = x + k * (m % h);
        k = k * 10;
        m = m / h;
    }
    double j = 10.0;
    double n2 = 1;
    while (n2 != 0)
    {
        y = y + ((int)(n * h)) / j;
        j = j * 10;
        if (j > 1000000)       //避免小数部分永不为零的影响
            break;
        n = n * h;
        if (n > 1)
            n = n - 1;
        int n1 = n;
        n2 = n - n1;
    }
    cout << "转换后的数为:";
    if (*s == 1)
        cout << "-";
    cout << x + y;
}
void trans(char a[], char b[], int* s)                                 //10-->16
{
    int len1 = strlen(a);
    int len2 = strlen(b);
    long m = 0, k = 10;
    long double n = 0;
    for (int i = 0; i < len1; i++)
        m = k * m + (long)(a[i] - '0');
    if (b[0] != '\0')
        for (int i = 0; i < len2; i++)
        {
            n = n + (double)(b[i] - '0') / k;
            k = k * 10;
        }
    cout << "转换后的数为:";
    if (*s == 1)
        cout << "-";
    char Q[20] = { 0 };
    int i = 0;
    if (m == 0)
        cout << "0";
    while (m != 0)
    {
        int q = m % 16;
        if (q == 10)
        {
            Q[i] = 'A';
            Q[i + 1] = '\0';
            i++;
        }
        else if (q == 11)
        {
            Q[i] = 'B';
            Q[i + 1] = '\0';
            i++;
        }
        else if (q == 12)
        {
            Q[i] = 'C';
            Q[i + 1] = '\0';
            i++;
        }
        else if (q == 13)
        {
            Q[i] = 'D';
            Q[i + 1] = '\0';
            i++;
        }
        else if (q == 14)
        {
            Q[i] = 'E';
            Q[i + 1] = '\0';
            i++;
        }
        else if (q == 15)
        {
            Q[i] = 'F';
            Q[i + 1] = '\0';
            i++;
        }
        else
        {
            Q[i] = q+'0';
            Q[i + 1] = '\0';
            i++;
        }
        m = m / 16;
    }
    int L = strlen(Q);
    for (int g = L - 1; g >= 0; g--)
        cout << Q[g];
    double j = 1.0;
    double d = 1;
    if (n != 0)
    {
        cout << ".";
        while (d != 0)
        {
            int w = (int)(n * 16);
            if (w == 10)
                cout << "A";
            else if (w == 11)
                cout << "B";
            else if (w == 12)
                cout << "C";
            else if (w == 13)
                cout << "D";
            else if (w == 14)
                cout << "E";
            else if (w == 15)
                cout << "F";
            else
                cout << w;
            j = j * 10;
            if (j > 1000000)                          //避免小数部分永不为零的影响
                break;
            n = n * 16;
            int c = n;
            d = n - c;
            n = d;
        }
    }
}

img


结果是这样,怎么点也点不下去,请各位帮忙看看,非常感谢!