为何Rust代码第12行触发panic?ParseIntError问题咨询
问题分析与解决
错误原因
你代码里的a.split("")是问题根源——这个方法会把字符串拆成包含首尾空字符串、字符间空字符串的迭代器。比如第二行输入是"1 3\n",拆分后会得到["", "1", " ", "3", "\n", ""]。当你对这些空字符串(或者像"\n"执行trim()后变成空的内容)执行parse::<i32>()时,必然会触发Empty类型的解析错误,调用unwrap()就直接panic了。
修正代码
如果你的第二行输入是空格分隔的整数,应该用split_whitespace()拆分,它会自动忽略所有空白字符(空格、换行、制表符等),只返回有效的非空白片段:
use std::io; fn main() { let mut s = String::new(); io::stdin().read_line(&mut s).unwrap(); let mut a = String::new(); io::stdin().read_line(&mut a).unwrap(); let q = s.trim().parse::<i32>().unwrap(); // 改用split_whitespace处理空白分隔的输入 for v in a.split_whitespace() { let p = v.parse::<i32>().unwrap(); println!("{}", q + p); } }
健壮性优化
直接用unwrap()遇到错误就panic,不够友好。可以用match处理解析错误,避免程序崩溃:
// 替换原代码中parse后的unwrap逻辑 match v.parse::<i32>() { Ok(p) => println!("{}", q + p), Err(e) => eprintln!("解析数字失败:{}", e), }
内容的提问来源于stack exchange,提问作者rustguy
相关产品推荐
相关产品推荐

