Rust中将字符串向量转换为u32向量时出现InvalidDigit错误如何解决
排查步骤
- 首先检查待转换字符串的不可见字符:90%以上的这类报错都是存在看不见的空白字符导致,比如Windows系统换行符残留的
\r、前后空格、制表符等,你肉眼看都是数字,但实际字符串包含非数字的空白符。可以在parse前插入调试代码打印字符串的原始内容:
就能快速定位到到底是哪个字符串存在异常字符。.map(|n| { println!("待转换字符串原始内容: {:?}", n); n.parse::<u32>().unwrap() }) - 检查是否存在空字符串:如果某一行完全等于你传入的
filter参数,trim_start_matches处理后会得到空字符串,空字符串解析u32也会触发InvalidDigit错误。 - 检查是否存在符号或超出u32范围的数值:如果字符串带负号、数值超过u32的最大值4294967295也会触发解析错误。
解决方案
针对最常见的换行符、空白字符问题,修改代码如下即可解决:
- 替换硬编码的
split("\n")为Rust原生的lines()方法,自动适配Windows的\r\n和Unix的\n换行格式,不会残留\r字符。 - 在修剪filter前缀后调用
trim()方法清除所有前后空白字符。 - 新增空字符串过滤逻辑,避免无效转换。
- 替换
unwrap为带错误上下文的panic逻辑,便于后续排查问题。
修改后的完整代码:
struct DayTwo { input: String } impl DayTwo { pub fn get_values(&self, filter: &str) -> Vec<u32> { let input: Vec<u32> = self.input .lines() .filter(|n| n.starts_with(filter)) .map(|x| x.trim_start_matches(filter).trim()) .filter(|s| !s.is_empty()) .map(|n| match n.parse::<u32>() { Ok(num) => num, Err(e) => panic!("转换失败,异常字符串:{:?},错误信息:{}", n, e) }) .collect(); for num in &input{ println!("{}", num); } input } }
内容的提问来源于stack exchange,提问作者Caio Ishikawa
相关产品推荐
相关产品推荐

