【问题标题】:How do I accept a literal "*" as a command-line argument?如何接受文字“*”作为命令行参数?
【发布时间】:2019-05-27 03:28:42
【问题描述】:

我正在用 rust 编写一个非常简单的命令行计算器,获取一个数字、一个运算符,然后是另一个数字,然后进行计算并打印结果。为了显示我从命令 args 中得到什么,我在主代码之前将它们打印在一个循环中。我对加号、减号和除法工作得很好,但是对于乘法,我得到了意想不到的结果,当我打印它时,我得到了当前目录上的文件列表,而不是星号 (*) 进行乘法运算。 这是我的 rust 代码,如果有任何解决方法,我将不胜感激。

use std::env;

fn main(){
    let args: Vec<String> = env::args().collect();

    for arg in args.iter(){
        println!("{}", arg);
    }

    let mut result = 0;
    let opt = args[2].to_string();
    let oper1 = args[1].parse::<i32>().unwrap();
    let oper2 = args[3].parse::<i32>().unwrap();
    match opt.as_ref(){
        "+" => result = oper1 + oper2,
        "-" => result = oper1 - oper2,
        "*" => result = oper1 * oper2,
        "/" => result = oper1 / oper2,
        _ => println!("Error")
    }

    println!("{} {} {} = {}", oper1, opt, oper2, result);

}

【问题讨论】:

  • 你的 shell 正在转换星星。这不是程序。您可以将其用引号括起来,例如“*”,它应该可以工作(将其传递到应用程序时)

标签: shell rust


【解决方案1】:

通配符 (*) 正在扩展。 Shell 会在看到您实际输入的内容之前将其发送给程序

You can read more about here.

为避免这种情况,您可以将其用引号括起来,如下所示:

./program 1 "*" 1

【讨论】:

  • 虽然这确实回答了问题,但我宁愿引用整个表达式并使用./program '1 * 1' 以避免进一步的意外。
猜你喜欢
  • 1970-01-01
  • 2022-11-25
  • 2013-11-24
  • 2013-09-26
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多