我的c ++程序的十六进制部分遇到了问题。当我使用十六进制开关时,没有任何返回。也出于某种原因我的二进制转换有一个领先的0我似乎无法摆脱。
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <array>
using namespace std;
void binary(int, int);
void hex(int, int);
int _tmain(int argc, _TCHAR* argv[])
{
int numb, base;
cout << "Enter a decimel number : ";
cin >> numb;
cout << "Enter a base you want number switched to: ";
cin >> base;
switch (base){
case 2: binary(numb, base); break;
case 8: break;
case 16: hex(numb, base); break;
default: break;
}
}
void binary(int numb, int base)
{
int bin[32] = { 0 };
int i = 0;
do
{
bin[i] = numb%base;
numb = numb / base;
i++;
} while (numb != 0);
cout << "\n";
while (i >= 0){
cout << bin[i];
i--;
}
cout << endl << endl;
}
void hex(int numb, int base){
int i;
int hex[10] = { 0 };
for (i=0; i > 10; i++){
hex[i] = numb%base;
numb = numb / base;
for (i; i > 0; i--)
{
if (hex[i] >= 10)
{
switch (hex[i]){
case 10: cout << "A"; break;
case 11: cout << "B"; break;
case 12: cout << "C"; break;
case 13: cout << "D"; break;
case 14: cout << "E"; break;
case 15: cout << "F"; break;
default: break;
}
}
cout << hex[i];
}
}
cout << endl;
}
答案 0 :(得分:0)
binary
问题出在第一个循环之后,i
比最后一个索引大一个。例如,假设您输入1
:输入do...while
循环,数字1
放入数组索引0
,然后i
递增到1
。
然后,在第二个循环中,打印索引1
和0
。您可以通过在进入此循环之前递减i
来解决此问题:
i--;
while (i >= 0){...}
你应该做这样的事情,因为如果你最终使用所有32
数字,你会尝试访问bin[32]
,程序可能会崩溃或输出乱码。
hex
第一个循环的条件是无限的:
for (i = 0; i >= 0; i++){...}
它应与binary
中的条件相同:
for (i = 0; numb != 0; i++){...}
但是你还没有完成,因为我注意到你的印刷中也有一个错误:
if (hex[i] >= 10)
{
switch (hex[i])
{
case 10:
cout << "A";
break;
...
}
}
cout << hex[i];
如果hex[i]
大于或等于10
,则会打印两次,一次为十六进制字母,一次为十进制数字。要解决此问题,您可以在交换机中使用continue
代替break
(跳过第二次打印),或使用else
:
if (hex[i] >= 10)
{
switch (hex[i])
{
case 10:
cout << "A";
break;
...
}
}
else
{
cout << hex[i];
}
您还需要进行与binary
中相同的更正:
// decrementing i before entering the loop
// vvv
for (i--; i >= 0; i--){...}
Your revision不正确,hex
不应该有嵌套循环。这很好before,只是我已经指出的更正。