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 风格)数组。