-2

我为我的班级编写了这个程序。我发现它可以使用 GNU g++ 编译器进行编译和运行。我的教授从他的网站自动评分我们的程序,该网站使用 Microsoft Visual Studio 编译器并引发错误。我也在 BSD clang 编译器中尝试过这个程序,但我得到了一个完全不同的错误。

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;
double dec2Bin(int value, char binaryString[])
{
    int x = 1;
    string hold = "";
    while(x <= value){
        x *= 2;
    }
    x /= 2;

    while(x >= 1){
        //cout << x << " ";
        if(value > x){
            hold += "1";
            value -= x;
        }
        else if(value < x){
            hold += "0";
        }
        else if(value == x){
            hold += "1";
            value = 0;
            //return hold;
        }
        x /= 2;

        //cout << hold << endl;
    }
    return atoi(hold);

}
int main()
{
    char binstr[100];
    int num = 0;
    cout << "Enter a decimal string: ";
    cin >> num;
    cout << "its "<<dec2Bin(num, binstr) << endl;

}

是什么让所有这些编译器如此不同?我能做些什么来确保我的代码可以在任何编译器中工作吗?

4

2 回答 2

5

“是什么让所有这些编译器如此不同?我能做些什么来确保我的代码可以在任何编译器中工作吗?”

该程序代码实际上不适用于任何 c++ 编译器。如果您有一个编译程序而没有抛出任何错误或警告的程序,那么它有一个严重的错误(另一个怀疑可能是,您没有在此处显示您的原始代码)。

当我在 Ideone 上编译您的程序时,我收到以下错误消息

prog.cpp:34:21: error: cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*' for argument '1' to 'int atoi(const char*)'

这表明您应该使用

 return atoi(hold.c_str());

因为std::string不会自动转换为const char*. 提到的std::string::c_str()功能就是这样做的。

此外,你一直错过#include <string>,而不是using namespace std;你应该更好地明确地写std::string.

这是您的代码的编译干净版本

于 2015-02-01T07:27:20.383 回答
1

您的代码不正确(当函数需要 a 时调用atoi传递std::string实例const char *)并且它不应该干净地编译。学习始终启用所有警告并学习理解它们的含义。

然而,问题中所述的内容确实可以在 C++ 中发生,原因是“未定义的行为”。

在大多数情况下,当您在 C++ 程序中运行时出错时,所发生的事情是完全不可预测的;它可能会崩溃(如果你很幸运),它可以为你提供无意义的结果(如果你有点幸运的话),或者尽管你犯了错误,它仍然可以正常工作(最危险但最常见的情况)。当然,行为可能会根据编译器、操作系统、月相而改变。

适用于 C++ 的墨菲定律告诉我们,当您测试程序时,一切都会正常工作,但是当您在包括您的老板和父母在内的一大群人面前在大屏幕上显示程序的舞台上时,它会惨遭失败:- )

于 2015-02-01T07:56:34.027 回答