解析合法整数字符串时为何出现ParseIntError { kind: InvalidDigit }?
错误原因与修复方案
错误原因
1. 无效字符触发解析失败
当某一行只有单个数字时(比如最后一行的7),你的代码里num2会保留初始值'\0'(空字符)。拼接后的字符串是"7\0",但trim()只会去除空格、换行这类空白字符,不会处理'\0'。尝试把这个字符串转成整数时,'\0'属于无效数字字符,直接触发ParseIntError panic。
2. 需求理解偏差
你的代码当前只提取每行的第一个和最后一个数字拼接,但实际需求是提取每行所有数字组成完整整数(比如第三行a1b2c3d4e5f要得到12345,而非15),这也导致结果根本不符合预期。
修复后的代码
直接遍历每行字符,收集所有数字再转成整数,逻辑更简洁也完全匹配需求:
use std::fs; fn main() { let contents = fs::read_to_string("day1.txt").expect("Should have been able to read the file"); let mut total = 0; for line in contents.lines() { // 收集当前行所有数字字符 let digits: String = line.chars() .filter(|c| c.is_numeric()) .collect(); // 转成整数,空行默认按0处理(避免panic) let number: i32 = digits.parse().unwrap_or(0); total += number; } println!("{}", total); }
关键改进点
- 用
filter+collect直接捞取所有数字字符,完美贴合提取所有数字的需求 - 用
unwrap_or(0)处理无数字的空行,不会因为意外情况panic - 删掉了固定长度的数组,避免文件行数变化时需要手动调整数组大小的麻烦
运行这段代码,输入你提供的测试文件,会输出预期的12402。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

