Rust解析等长数字字符串为usize时出现长度异常缩短问题
问题原因
- 核心原因:
usize是数值类型,本身不存储前导零信息。你输入的字符串如果以0开头,转为整数后前导零会被自动丢弃,打印时就会出现长度变短的情况,例如原字符串000000001110转为usize后值为1110,直接打印只会输出4位,完全符合你遇到的现象。 - 潜在问题:你使用
split("\n")分割换行,在Windows平台下文本文件换行符为\r\n,分割后得到的字符串末尾会残留\r字符,可能导致解析异常或者意外的字符截断。
解决方案
场景1:仅需原样输出内容,不需要做数值运算
不需要做类型转换,直接打印分割得到的字符串即可,完全保留原始格式:
use std::fs::File; use std::io::Read; fn read_input() -> String { let mut input = String::new(); File::open("input.txt").unwrap().read_to_string(&mut input).unwrap(); // 用lines方法自动处理跨平台换行,自动过滤换行符残留 let test: Vec<&str> = input.lines().collect(); for num in test{ println!("{}", num); } return input; }
场景2:需要将字符串作为十进制整数运算,打印时保留12位长度
打印时使用格式控制符补前导零即可:
use std::fs::File; use std::io::Read; fn read_input() -> String { let mut input = String::new(); File::open("input.txt").unwrap().read_to_string(&mut input).unwrap(); let test: Vec<&str> = input.lines().collect(); let test2: Vec<usize> = test.iter().map(|n| n.parse().unwrap()).collect(); // {:012} 表示输出至少12位,长度不足时自动补前导零 for num in test2{ println!("{:012}", num); } return input; }
场景3:原字符串是二进制数值的文本表示
如果你的输入是二进制字符串,之前按十进制解析会导致数值完全错误,需要指定进制解析,打印二进制时补前导零:
use std::fs::File; use std::io::Read; fn read_input() -> String { let mut input = String::new(); File::open("input.txt").unwrap().read_to_string(&mut input).unwrap(); let test: Vec<&str> = input.lines().collect(); // 按二进制规则解析字符串为usize let test2: Vec<usize> = test.iter().map(|n| usize::from_str_radix(n, 2).unwrap()).collect(); // {:012b} 表示输出12位二进制格式,长度不足时自动补前导零 for num in test2{ println!("{:012b}", num); } return input; }
内容的提问来源于stack exchange,提问作者Caio Ishikawa
相关产品推荐
相关产品推荐

