我正在编写一个项目,我们从命令行执行简单的计算器。用户以此格式输入 programname firstNumber operator secondNumber 。这是我到目前为止所得到的:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int main(int argc, char* argv[])
{
cout << fixed << setprecision(2);
if (argc != 4)
{
cerr << "Usage: " << argv[0] << " <number> <operator> <number>" << endl;
exit(0);
}
else
{
double firstNumber = atoi(argv[1]);
char theOperator = argv[2][0];
double secondNumber = atoi(argv[3]);
switch (theOperator)
{
case'+':
{
cout << "The answer is " << firstNumber + secondNumber << endl;
break;
}
case '-':
{
cout << "The answer is " << firstNumber - secondNumber << endl;
break;
}
case '*':
{
cout << "The answer is " << firstNumber * secondNumber << endl;
break;
}
case '/':
{
if (secondNumber == 0)
{
cout << "Can not devide by a ZERO" << endl;
break;
}
else
{
cout << "The answer is " << firstNumber / secondNumber << endl;
break;
}
}
}
}
}
我想出了一个问题,我的项目计算错误的十进制数。例如,如果我做2.5 + 1.25,结果是3.有人可以帮助我吗?我是C ++的新手
答案 0 :(得分:4)
其他答案都是正确的,但是我要使用strtod而不是以Eris的名义进行推销,因为检查输入的正确性会更容易。
char * endp;
double firstNumber;
if (argv[1][0] != '\0')
{ // input string is not empty
firstNumber = strtod (argv[1], &endp);
if (*endp != '\0')
{ // number didn't end at the end of the string. String not a number.
cout << "First number was not a number, dude." << endl;
return 0;
}
}
else
{
cout << "Can't do much without a number, dude." << endl;
return 0;
}
通过atof,可以使用&#34来调用该程序;我是现代少将的模型&#34;并产生结果。结果不好,但结果都一样。
哦,并在C ++中调用exit
时发出警告。程序在那里停止死亡,并且没有调用析构函数。这里没有坏处,但不是一个好习惯。
答案 1 :(得分:3)
在行
double firstNumber = atoi(argv[1]);
和
double secondNumber = atoi(argv[3]);
atoi
将参数转换为int
(因此在小数点后截断)。您需要将其转换为double
。您应该使用std::atof
,或者,如果使用C ++ 11,也可以使用std::stod(argv[1]);
。
答案 2 :(得分:3)
问题在于:
double firstNumber = atoi(argv[1]);
char theOperator = argv[2][0];
double secondNumber = atoi(argv[3]);
atoi
会将字符串转换为int
,因此2.5
将转换为2
,而1.25
将转换为1,即“{1}}为什么你得到结果2 + 1 = 3
。请改用atof
。
答案 3 :(得分:3)
问题是如何在数字中转换字符串:您正在使用WeakReference
,其名称建议将输入转换为整数。
解决方案是简单地用atoi
替换它,这将正确读取浮点数。
答案 4 :(得分:1)
除了@meneldal建议,您还可以在C ++中使用stringstream将字符串转换为数字
double value;
stringstream(someString) >> value;