Как я принимаю литерал "*" в качестве аргумента командной строки? - PullRequest
1 голос
/ 27 мая 2019

Я пишу очень простой калькулятор командной строки на ржавчине, получаю число, оператор, затем другое число, делаю вычисления и печатаю результат. Чтобы показать, что я получаю из командных аргументов, я напечатал их в цикле перед основным кодом. Я отлично работаю для плюса, минуса и деления, но для умножения я получаю неожиданный результат, поскольку при печати вместо звездочки (*) для умножения я получаю список файлов в моем текущем каталоге. Вот мой код ржавчины, я буду признателен за объяснение, и если есть какие-либо обходные пути.

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);

}

1 Ответ

7 голосов
/ 27 мая 2019

Подстановочный знак (*) расширяется. Оболочка отправит это в программу еще до того, как увидит, что вы на самом деле набрали 1002 *

Подробнее об этом можно прочитать здесь.

Чтобы избежать этого, вы можете просто заключить его в кавычки, например:

./program 1 "*" 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...