You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:15:01