编译不报错,但是运行的时候又是运行不下去,不输出结果,我设断点找说是因为“读取字符串时出错”但我搞不清原因
#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;
}
}
}

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