C++ switch语句奇数输出

标签 c++ switch-statement

我正在为 C++ 入门类(class)完成期末作业。到目前为止我编写的代码有效,但它产生了一些有趣的输出,我正在寻求澄清。这是我的代码:

(注意:是的,我知道使用 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在代码的 main 函数中声明,因为如果用户在 decimal_number 中输入任何 other 十进制数变量,程序会将一串十进制数字存储到decimal_number中,我不知道这些数字从何而来。它们似乎不是任何 ASCII 等价物。

...如果这些都没有任何意义,我很抱歉。只需输入 cout << decimal_numbercin >> 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');
}

如果您不执行这种验证,那么无论何时读取非十进制数,您都会使流处于无效状态,并且您认为正在读取的变量最终将未初始化。

关于C++ switch语句奇数输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30058663/

相关文章:

c++ - Win32 API 中 PathAppend 和 PathCombine 的区别

c# - 有没有办法让我的 switch/case 进入 C# 中的下一个 case?

C# Change If 切换,如何处理 "and"

c++ - boost mpi 发送 NULL 消息

C++ 继承/VTable 问题

c++ - 为什么 lambda 的调用运算符隐式为 const?

c++ - 如何重载模板函数以用于枚举?

javascript - 如何在按键时触发动画

c++ - 对两个案例标签使用相同的值与对单个案例使用多个案例标签有什么区别?

python - tkinter 是否可以在同一位置拉出不同的屏幕