【问题标题】:How to pass character `^` to my program from commnd prompt? [duplicate]如何从命令提示符将字符“^”传递给我的程序? [复制]
【发布时间】:2020-01-08 08:21:12
【问题描述】:

我有一个关于计算器的简单示例:

  • 输入第一个操作数,然后输入运算符,如果运算符是一元,则无需输入第二个。所以打印结果,例如:如果一个数字不需要第二个操作数,则为正方形。

  • 输入可以从命令提示符传递到程序中,否则在程序从输入流启动后。

  • 我想将输入作为参数传递给程序的原因是有时我想从命令提示符调用我的程序,所以我可以发出:calc 57 + 12 + enter: I get 69。

  • 该程序运行良好,但是当涉及到平方运算符时,在我的例子中我使用了^ 它可以从输入流 (std::cin) 但如果我通过命令提示符传递它我不能?!

    int main(int argc, char* argv[]){
    
        int a = 0;
        int b = 0;
        char op = '\0';
    
        if(argc < 2){
            std::cout << "a: ";
            std::cin >> a;
            std::cout << "op: ";
            std::cin >> op;
    
            switch(op){
                case '^':
                    std::cout <<  a << " ^2 " << " = " 
                        << a * a << std::endl;
                break;
                case '+':
                    std::cout << "b: ";
                    std::cin >> b;
                    std::cout <<   a << " + " << b << " = " 
                    << a + b << std::endl;
                break;
                case '-':
                    std::cout << "b: ";
                    std::cin >> b;
                    std::cout << a << " - " << b << " = " 
                    << a - b << std::endl;
                break;
                case '*':
                    std::cout << "b: ";
                    std::cin >> b;
                    std::cout << a << " * " << b << " = " 
                    <<  a * b << std::endl;
                break;
                case '/':
                    std::cout << "b: ";
                    std::cin >> b;
                    std::cout << a << " / " << b << " = " 
                    << a / b << std::endl;
                break;
                case '%':
                    std::cout << "b: ";
                    std::cin >> b;
                    std::cout << a << " % " << b << " = " 
                    <<  a % b << std::endl;
                break;
            }
    
        }
        else{
            a = atoi(argv[1]);
            op = argv[2][0];
        }
    
        if(argc == 3){
            std::cout << "argc = 3" << std::endl;
            std::cout << "op: " << op << std::endl;
            switch(op){
                case '^':
                    std::cout <<  a << " ^2 " << " = " 
                        << a * a << std::endl;
                break;
            }
        }
        else
            if(argc == 4){
                b = atoi(argv[3]);
                switch(op){
                    case '+':
                        std::cout <<   a << " + " << b << " = " 
                        << a + b << std::endl;
                    break;
                    case '-':
                        std::cout << a << " - " << b << " = " 
                        << a - b << std::endl;
                    break;
                    case '*':
                        std::cout << a << " * " << b << " = " 
                        <<  a * b << std::endl;
                    break;
                    case '/':
                        std::cout << a << " / " << b << " = " 
                        << a / b << std::endl;
                    break;
                    case '%':
                        std::cout << a << " % " << b << " = " 
                        <<  a % b << std::endl;
                    break;
                }
            }
    
        std::cin.get()
        return 0;
    }
    
  • 如果我从命令提示符发出:calc 7 ^ 我没有得到49,但命令询问我more ?

【问题讨论】:

  • 您是否尝试使用调试器单步执行您的代码?

标签: c++ argv argc


【解决方案1】:

这实际上不是 C++ 问题,而是终端问题。在cmd和windows批处理中^是续行符号。

要真正传递^,您必须将其转义。转义符号是... [[drum roll]] ^。因此,您必须在 cmd 中写入 ^^ 才能将 ^ 实际传递给您的程序。

【讨论】:

  • 但是当我通过^^它对我不起作用例如:calc 5 ^^ 当我按回车时我得到:argc = 3 op: ^ 而不是25
  • @ItachiUchiwa 在我修复代码中阻止其编译的其他问题时为我工作。向我们展示您的实际 minimal reproducible example,而不是带有未知数量更改的传真。
  • @LightnessRacesinOrbit:这就是所有代码。代码中有哪些错误?你宁愿陈述它们。
【解决方案2】:

^ 字符对 c++ 来说没什么特别的。将其作为任何其他角色处理并没有错。您的问题源于您的外壳。但是,您并没有告诉我们您使用的是哪个 shell。当您遇到 ^ 问题时,我猜您是在 Windows 环境中运行程序。在 Windows 命令提示符中,^ 是转义字符。您正在转义下一个字符(cmd 提示符丢弃 ^ 并将下一个字符视为:一个字符),这就是为什么您在程序的参数中找不到 ^ 本身。

可以在此处找到有关特殊 shell 字符的更多信息:

【讨论】:

    猜你喜欢
    • 2018-12-27
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2017-02-26
    • 2012-10-05
    • 2018-09-02
    • 2019-01-10
    相关资源
    最近更新 更多