Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 传递给主函数的命令行参数是否存在异常?_C++_Cmd - Fatal编程技术网

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

我正在使用命令行参数并实现一个非常基本的计算器,它在执行之前而不是在运行时接受输入。它可以运行4次,但我在电源运行时卡住了,几个小时后发现了故障。下面是C++代码:

#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