C ++ switch语句奇数输出

时间:2015-05-05 16:40:08

标签: c++ switch-statement

我正在为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,然后运行代码并查看奇怪的数字。我希望这能让事情更加清晰。

无论如何,我的导师难倒了,我很难过。我已经得到了教师将接受的上述解决方法,但为了我自己的理智,我只想弄清楚发生了什么。任何帮助或指示表示赞赏。干杯!

3 个答案:

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