C++ switch语句奇数输出
C++ switch statement odd output
我正在为 C++ 入门课程完成期末作业。到目前为止,我编写的代码 有效 ,但它产生了一些有趣的输出,我正在寻求澄清。这是我的代码:
(警告:是的,我知道使用 void main()
很糟糕,但我们在 class 中使用 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
语句,因为如果用户输入任何 other 而不是十进制数decimal_number
变量,程序会将一串十进制数字存储到 decimal_number
中,我不知道这些数字是从哪里来的。它们似乎不是任何 ASCII 等价物。
... 如果其中 none 有意义,我很抱歉。只需在 cin >> decimal_number
行之后输入 cout << decimal_number
,然后输入 运行 代码,看看会出现什么奇怪的数字。我希望这能让事情变得更清楚。
无论如何,我的导师难倒了,我也难倒了。我已经准备好导师会接受的上述解决方法,但为了我自己的理智,我只想弄清楚发生了什么。任何帮助或指示表示赞赏。干杯!
可以测试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');
}
如果您不执行这种验证,那么无论何时读取非十进制数,您都会使流处于无效状态,并且您认为正在读取的变量最终将未初始化。
However, I've found that I've had to include an IF statement within the main function of the code, because if the user inputs anything other than a decimal number into the decimal_number variable, the program will store a string of decimal numbers, into decimal_number, and I have no idea where those numbers come from.
好吧,您没有将 decimal_number
初始化为任何东西,并且您没有对 cin >> decimal_number
调用进行任何错误检查。所以我不确定您还期望什么,但是 decimal_number
!
的未指定值
你的导师应该知道这一点。令人担忧的是,除了教您编写符合国际标准 (void main
!!) 格式错误的代码之外,他们未能发现此问题或注意到您没有进行错误检查。
作业的意义是什么?
转换可以简化为:
cout << hex << decimal_value << endl;
或者如果你需要它在一个字符串中:
std::string convert_decimal_to_hex_string(int decimal_value)
{
std::ostringstream output;
output << hex << value;
return output.str();
}
我相信 class 应该向您展示如何使用 std::string
和现有的语言功能(例如 hex
操纵器)。对字符串使用 char
是危险的。
此外,由于您不知道十进制值的大小或限制,因此您需要动态分配(即在 运行 时间内)保存字符的数组。想想分配2个字符,输入值1024;缓冲区溢出。
更改您的程序以使用 std::string
。避免使用字符(C 风格)数组。
我正在为 C++ 入门课程完成期末作业。到目前为止,我编写的代码 有效 ,但它产生了一些有趣的输出,我正在寻求澄清。这是我的代码:
(警告:是的,我知道使用 void main()
很糟糕,但我们在 class 中使用 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
语句,因为如果用户输入任何 other 而不是十进制数decimal_number
变量,程序会将一串十进制数字存储到 decimal_number
中,我不知道这些数字是从哪里来的。它们似乎不是任何 ASCII 等价物。
... 如果其中 none 有意义,我很抱歉。只需在 cin >> decimal_number
行之后输入 cout << decimal_number
,然后输入 运行 代码,看看会出现什么奇怪的数字。我希望这能让事情变得更清楚。
无论如何,我的导师难倒了,我也难倒了。我已经准备好导师会接受的上述解决方法,但为了我自己的理智,我只想弄清楚发生了什么。任何帮助或指示表示赞赏。干杯!
可以测试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');
}
如果您不执行这种验证,那么无论何时读取非十进制数,您都会使流处于无效状态,并且您认为正在读取的变量最终将未初始化。
However, I've found that I've had to include an IF statement within the main function of the code, because if the user inputs anything other than a decimal number into the decimal_number variable, the program will store a string of decimal numbers, into decimal_number, and I have no idea where those numbers come from.
好吧,您没有将 decimal_number
初始化为任何东西,并且您没有对 cin >> decimal_number
调用进行任何错误检查。所以我不确定您还期望什么,但是 decimal_number
!
你的导师应该知道这一点。令人担忧的是,除了教您编写符合国际标准 (void main
!!) 格式错误的代码之外,他们未能发现此问题或注意到您没有进行错误检查。
作业的意义是什么?
转换可以简化为:
cout << hex << decimal_value << endl;
或者如果你需要它在一个字符串中:
std::string convert_decimal_to_hex_string(int decimal_value)
{
std::ostringstream output;
output << hex << value;
return output.str();
}
我相信 class 应该向您展示如何使用 std::string
和现有的语言功能(例如 hex
操纵器)。对字符串使用 char
是危险的。
此外,由于您不知道十进制值的大小或限制,因此您需要动态分配(即在 运行 时间内)保存字符的数组。想想分配2个字符,输入值1024;缓冲区溢出。
更改您的程序以使用 std::string
。避免使用字符(C 风格)数组。