C++ 传递给主函数的命令行参数是否存在异常?
我正在使用命令行参数并实现一个非常基本的计算器,它在执行之前而不是在运行时接受输入。它可以运行4次,但我在电源运行时卡住了,几个小时后发现了故障。下面是C++代码:C++ 传递给主函数的命令行参数是否存在异常?,c++,cmd,C++,Cmd,我正在使用命令行参数并实现一个非常基本的计算器,它在执行之前而不是在运行时接受输入。它可以运行4次,但我在电源运行时卡住了,几个小时后发现了故障。下面是C++代码: #include <iostream> #include <sstream> #include <cmath> #include <cstring> using namespace std; int main(int argc, char **argv) { string
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstring>
using namespace std;
int main(int argc, char **argv) {
stringstream s(strcat(strcat(argv[1], " "), argv[3]));
int a, b;
s >> a >> b;
switch(argv[2][0]) {
case '+':
cout << a+b;
break;
case '-':
cout << a-b;
break;
case '*':
cout << a*b;
break;
case '/':
cout << a/b;
break;
case 'p':
cout << pow(a, b);
break;
default:
cerr << "Invalid operation";
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv){
字符串流s(strcat(strcat(argv[1],“”),argv[3]);
INTA,b;
s>>a>>b;
开关(argv[2][0]){
格“+”:
不能不要这样做:
您正在溢出argv[1]
的缓冲区大小
相反,使用std::string
来正确分配执行连接所需的内存量。在windows shell(批处理脚本)中,插入符号(^
)是转义字符(请参阅此处的更多信息:)。因此,如果希望shell将其视为普通字符,则需要将其自身转义
所以你会跑:
calc.exe 3 ^^ 3
您可以在shell中使用echo
来测试这一点。您可以运行echo te^st
查看shell将其视为什么,然后运行echo te^st
此外,您应该在程序中至少添加一些错误处理,以便更快地捕获此类事件。例如,您可以检查argc
,以确保传递的参数数量与您期望的数量相符。您可以添加检查s>>a>>b
,以确保确实传递了数字,等等。为什么要标记它C
?您使用的是什么类型的shell?我猜shell在将^
传递给您之前将其视为一个特殊字符。当您传递^
时,argv
中的值是什么?这解决了问题。我想我将使用p或其他东西,但不使用插入符号。此外,正如您所建议的,我添加了异常C现在还使用C++字符串和StIO()来进行转换,但它从来没有显示缓冲区溢出警告,所以AGV(1)的大小限制是什么??stringstream
可以很好地进行转换,尽管独立地转换存储在单独的argv
元素中的两个数字显然更容易,而不是将它们串联起来再将它们分开。argv[1]
的大小限制是main(argc,argv)时已经在其中的字符串的大小
被调用。
calc.exe 3 ^^ 3