我已经为我的班级写了这个程序。我发现它使用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;
}
是什么让所有这些编译器如此不同?有什么我可以做的,以确保我的代码可以在任何编译器中工作吗?
答案 0 :(得分:5)
“是什么让所有这些编译器如此不同?我能做些什么来确保我的代码能在任何编译器中运行吗?”
此程序代码实际上不适用于任何c ++编译器。如果你有一个编译程序而没有抛出任何错误或警告,它有一个严重的错误(另一个怀疑可能是,你没有在这里显示你的原始代码)。
当我编译your program on 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
。
答案 1 :(得分:1)
您的代码不正确(当函数需要atoi
时,调用std::string
传递const char *
实例)并且它不应该干净地编译。学会始终启用所有警告并学习理解其含义。
然而,问题中陈述的内容确实可以在C ++中发生,原因是&#34;未定义的行为&#34;。
当你在C ++程序中运行时出错时,在大多数情况下发生的事情是完全不可预测的;它可以崩溃(如果你很幸运),它可以为你提供无意义的结果(如果你有点幸运),或者它可以正常工作,尽管你的错误(最危险但常见的情况)。当然,行为可能会根据编译器,操作系统,月球的相位而改变。
适用于C ++的Murphy法则告诉你,当你测试你的程序时,一切都会正常工作,但是当你在一个舞台上展示程序时,fail miserably会显示包括你老板和父母在内的庞大人群: - )