Rust中是否存在不向输入追加内容的read_line替代方法?
有没有替代Rust中
read_line的方法,无需手动处理换行符? 当然有啦!你遇到的read_line会保留换行符的问题确实有点烦人,除了手动用trim()处理之外,还有几种更省心的方式,不管是用标准库的小技巧还是第三方 crate 都能解决:
1. 用标准库BufRead的lines()方法
BufRead提供的lines()方法会自动帮你去掉每行末尾的换行符(不管是\n还是Windows下的\r\n),用起来也很顺手:
use std::io::{self, BufRead}; fn main() { println!("How Old Are You?"); let stdin = io::stdin(); // 读取一行,自动剔除换行符 let age = stdin.lock().lines().next().expect("Failed to read line") .expect("Error reading input"); println!("You are {} years old!", age); }
这里lines()返回的是迭代器,每次迭代会返回一个Result<String, io::Error>,所以需要两次expect来处理可能的错误(如果你的main函数改成返回Result,也可以用?简化)。
2. 借助第三方crate简化输入
如果不想写太多样板代码,很多第三方输入处理 crate 都封装了自动处理换行的逻辑,推荐两个常用的:
text_io crate
先在Cargo.toml里添加依赖:
[dependencies] text_io = "0.1"
然后代码可以写成这样,不仅自动处理换行,还能直接解析成指定类型:
use text_io::read; fn main() { println!("How Old Are You?"); // 直接读取字符串,自动去掉换行 let age: String = read!("{}\n"); // 如果确定输入是数字,还能直接读成整数: // let age: u32 = read!("{}\n"); println!("You are {} years old!", age); }
scan_fmt crate
同样先加依赖:
[dependencies] scan_fmt = "0.2"
这个 crate 更偏向格式化扫描,适合需要按特定格式读取输入的场景:
use scan_fmt::scan_fmt; fn main() { println!("How Old Are You?"); // 读取输入并匹配格式,自动忽略换行 let age = scan_fmt!("{}", String).expect("Failed to read age"); // 也可以直接解析成数字:let age: u32 = scan_fmt!("{}", u32).unwrap(); println!("You are {} years old!", age); }
3. 自己封装一个复用函数
如果不想依赖第三方 crate,也可以自己写个简单的小函数,以后需要读取输入时直接调用就行:
use std::io::{self, BufRead}; fn read_clean_input() -> io::Result<String> { let stdin = io::stdin(); stdin.lock().lines().next().unwrap_or(Ok(String::new())) } fn main() { println!("How Old Are You?"); let age = read_clean_input().expect("Failed to get age"); println!("You are {} years old!", age); }
内容的提问来源于stack exchange,提问作者Melon Bread
相关产品推荐
相关产品推荐

