我是C ++的新手。我正在使用命令行编写一个简单的计算器。命令行应具有以下格式: programname firstNumber运算符secondNumber 这是我到目前为止所得到的:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
if (argc != 3)
{
cerr << "Usage: " << argv[0] << endl;
exit(0);
}
else
{
int firstNumber = atoi(argv[1]);
char theOperator = atoi(argv[2]);
int 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;
}
}
}
}
}
程序无法运行。当我运行它时,它会显示一个适当的用法消息并结束程序。有人可以帮帮我吗?
答案 0 :(得分:4)
其他人已经给你答案,但你可以很容易地自己想出这个。只需在您知道代码进入的位置打印argc
:
int main(int argc, char* argv[])
{
if (argc != 3)
{
cout << "argc is: " << argc << endl; // Debug output that you delete later
cerr << "Usage: " << argv[0] << endl;
exit(0);
}
else
然后回来argc
。当你发现argc
实际上是4并且你想知道argc
里面的内容时,你应该写一些代码来打印它,这样你就可以搞清楚......就像这样:
int main(int argc, char* argv[])
{
cout << "argc is: " << argc << endl; // Debug output that you delete later
for (int i = 0; i < argc; ++i)
{
// Print out all of the arguments since it's not working as you expect...
cout << "argv[" << i << "] = " << argv[i] << endl;
}
if (argc != 3)
{
cerr << "Usage: " << argv[0] << endl;
exit(0);
}
else
你很快就会弄清楚出了什么问题......
请了解如何执行此操作,因为它会保存您的,但将来您无需等待答案。
此外,您的代码中还有其他错误。
为什么你要将+
字符从字符串转换为int?
else
{
int firstNumber = atoi(argv[1]);
char theOperator = atoi(argv[2]); // <<< WTF? Why?
int secondNumber = atoi(argv[3]);
switch (theOperator)
你可能想摆脱那里的atoi
部分,然后选择:
char theOperator = argv[2][0]; // First character of the string
如果第二个参数总是只有一个字母......你可能想要强制执行/检查。请参阅strlen()和std::string,并注意argv[2]
的类型为char*
(指向char
的指针)。
我还建议您阅读How to debug small programs链接的SO Howto-Ask Help Page。这可能会有所帮助。不,我认为你的问题不好。调试小程序是您将来需要的一项技能,如果您打算编程,那么现在就可以从中受益。
欢迎使用编程和C ++:)
答案 1 :(得分:1)
如果您输入
Noda Time | .NET BCL | SQL Server
---------------|----------------------------|------------------------------------------
Instant | DateTime or DateTimeOffset | datetime2 or datetimeoffset
OffsetDateTime | DateTimeOffset | datetimeoffset
LocalDateTime | DateTime | datetime2
LocalDate | DateTime | date
LocalTime | TimeSpan | time
Duration | TimeSpan | int or bigint (Ticks, TotalSeconds, etc.)
Period | String | varchar
ZonedDateTime | DateTimeOffset + String | datetimeoffset + varchar (or a UDT)
你有4个参数,而不是3个。
#slide-4.step.active {
#logo img {
transform: scaleX(-1);
}
}
看起来你的程序工作正常......至少就打印用法信息而言。
另请参阅有关使用operator参数的其他注释。
答案 2 :(得分:1)
参数argc
也会计算程序的名称。
试试这个:
if (argc != 4) // We expect 4 arguments: programname number operator number
{
cerr << "Usage: " << argv[0] << " <number> <operator> <number>" << endl;
exit(0);
}
在您的代码中,正确运行程序(包含所有3个参数)会显示错误消息,因为argc
等于4
。