我正在为C ++入门课程的最终作业工作。到目前为止我编写的代码有效,但它正在产生一些有趣的输出,我正在寻找澄清。这是我的代码:
(警告:是的,我知道使用void main()
很糟糕,但我们在课堂上使用Visual Studio,这是教师的偏好。)
#include <string>
#include <iostream>
using namespace std;
void conversion(int);
void main()
{
int decimal_number, answer;
cout << "Please enter a whole decimal number (e.g. 20): ";
cin >> decimal_number;
if (decimal_number == 0)
{
answer = 0;
cout << "The hexadecimal value of your number is: " << answer;
getchar();
getchar();
}
else if (decimal_number < 0)
{
cout << "INVALID ENTRY" ;
getchar();
getchar();
}
else if (decimal_number > 0)
{
conversion(decimal_number);
}
getchar();
getchar();
}
void conversion (int decimal_number)
{
int count = 0, remainder, reverse_order;
char hexadecimal_number[10] = { NULL };
while (decimal_number != 0)
{
remainder = decimal_number % 16;
switch (remainder)
{
case 0:
hexadecimal_number[count] = '0';
count++;
break;
case 1:
hexadecimal_number[count] = '1';
count++;
break;
case 2:
hexadecimal_number[count] = '2';
count++;
break;
case 3:
hexadecimal_number[count] = '3';
count++;
break;
case 4:
hexadecimal_number[count] = '4';
count++;
break;
case 5:
hexadecimal_number[count] = '5';
count++;
break;
case 6:
hexadecimal_number[count] = '6';
count++;
break;
case 7:
hexadecimal_number[count] = '7';
count++;
break;
case 8:
hexadecimal_number[count] = '8';
count++;
break;
case 9:
hexadecimal_number[count] = '9';
count++;
break;
case 10:
hexadecimal_number[count] = 'A';
count++;
break;
case 11:
hexadecimal_number[count] = 'B';
count++;
break;
case 12:
hexadecimal_number[count] = 'C';
count++;
break;
case 13:
hexadecimal_number[count] = 'D';
count++;
break;
case 14:
hexadecimal_number[count] = 'E';
count++;
break;
case 15:
hexadecimal_number[count] = 'F';
count++;
break;
default:
cout << decimal_number << "+++ " << hexadecimal_number;
cout << "INVALID ENTRY";
getchar();
getchar();
}
decimal_number = decimal_number / 16;
}
cout << "The hexadecimal value of your number is: ";
for (reverse_order = count -1; reverse_order >= 0; reverse_order--)
{
cout << hexadecimal_number[reverse_order];
}
getchar();
getchar();
}
所以,就像我说的:我的代码有效。我可以将任何数字输入作为小数,并将其转换为十六进制等效值。但是,我发现我必须在代码的主函数中包含IF
语句,因为如果用户输入其他而不是十进制数字到{{ 1}}变量,程序会将一个十进制数字串存储到decimal_number
中,我不知道这些数字来自哪里。它们似乎不是任何东西的ASCII等价物。
......如果没有任何意义,我很抱歉。只需在行decimal_number
之后输入cout << decimal_number
,然后运行代码并查看奇怪的数字。我希望这能让事情更加清晰。
无论如何,我的导师难倒了,我很难过。我已经得到了教师将接受的上述解决方法,但为了我自己的理智,我只想弄清楚发生了什么。任何帮助或指示表示赞赏。干杯!
答案 0 :(得分:4)
您可以测试cin >> decimal_number
的结果是否成功,例如
if(!(cin>>decimal_number))
throw std::runtime_error("Oops, not a decimal number!");
这有点过于极端,你也可以验证输入:
while(!(cin>>decimal_number))
{
std::cout << "Not decimal, input again ";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
如果您没有执行此类验证,那么每当读取非小数时,您都会将流保留为无效状态,而您认为自己正在阅读的变量将最终未初始化
答案 1 :(得分:1)
但是,我发现我必须在代码的main函数中包含一个IF语句,因为如果用户在decimal_number变量中输入十进制数以外的任何内容,程序将存储一个字符串十进制数,十进制数,我不知道这些数字来自哪里。
好吧,您没有初始化decimal_number
任何内容,并且您在cin >> decimal_number
调用周围没有任何错误检查。所以我不确定你预期的是什么,但是decimal_number
的未指定值!
你的导师应该知道这一点。令人担心的是,除了教你根据国际标准编写错误的代码(void main
!!)之外,他们没有发现这个问题,或者注意到你没有错误检查。
答案 2 :(得分:0)
作业有什么意义?
转换可以简化为:
cout << hex << decimal_value << endl;
或者如果你需要一个字符串:
std::string convert_decimal_to_hex_string(int decimal_value)
{
std::ostringstream output;
output << hex << value;
return output.str();
}
我相信课程应该向您展示如何使用std::string
和现有语言功能(例如hex
操纵器)。使用char
作为字符串是危险的。
此外,由于您不知道十进制值的大小或限制,因此您需要动态分配(即在运行时)包含字符的数组。考虑分配2个字符并输入值1024;缓冲区溢出。
将您的计划更改为使用std::string
。避免使用字符(C风格)数组。