Rust解析CLI参数时String向量转i32向量触发解析panic问题
问题原因
std::env::args() 收集到的字符串向量中,第一个元素固定为当前程序的可执行文件路径,不属于用户传入的业务参数。你的代码没有跳过这个路径元素,直接把整个向量传入into_num_vec()做整数解析,文件路径字符串无法被转换为i32类型,因此触发解析失败的panic。
另外原代码还有两个小问题:
- 参数数量判断的提示信息拼写错误,
To few arguments正确写法为Too few arguments - 解析错误时吞掉了错误上下文,无法快速定位是哪个参数解析失败
修复代码
修正后的lib.rs
pub fn affirm_args(input: Vec<String>) { // 切片跳过第一个元素(程序路径),只保留用户传入的参数 let user_args = &input[1..]; if user_args.is_empty() { panic!("Too few arguments"); } else { let numbers = into_num_vec(user_args.to_vec()); print_numbers(numbers); } } fn into_num_vec(input: Vec<String>) -> Vec<i32> { let mut collection: Vec<i32> = Vec::new(); for (pos, arg) in input.iter().enumerate() { match arg.trim().parse() { Ok(n) => collection.push(n), Err(e) => panic!("第{}个参数'{}'解析失败:{}", pos + 1, arg, e) } } collection } pub fn print_numbers(input: Vec<i32>) { for i in input { println!("{}", i); } }
main.rs无需修改,保持原有逻辑即可
use sort_program::*; use std::env; fn main() { let args: Vec<String> = env::args().collect(); affirm_args(args); }
运行验证
在项目根目录执行带数字参数的运行命令即可正常输出:
cargo run 12 34 56 78
预期输出:
12 34 56 78
内容的提问来源于stack exchange,提问作者LaurentBaj
相关产品推荐
相关产品推荐

