String 修剪'\n';从io::stdin().读取行()?
下面的代码适合我String 修剪'\n';从io::stdin().读取行()?,string,rust,newline,String,Rust,Newline,下面的代码适合我 let mut buffer = String::new(); io::stdin().read_line(&mut buffer); buffer = buffer.trim().to_string(); 从read\u line中修剪'\n'的更好/正确方法是什么?我只看到代码中可以改进的一个方面:分配两个字符串来读取一行。第一次分配发生在将该行读入缓冲区时,第二次分配发生在到_string()中 根据上下文,有几种方法可以避免这种情况。最简单的方法是避免调用字符
let mut buffer = String::new();
io::stdin().read_line(&mut buffer);
buffer = buffer.trim().to_string();
从
read\u line
中修剪'\n'
的更好/正确方法是什么?我只看到代码中可以改进的一个方面:分配两个字符串来读取一行。第一次分配发生在将该行读入缓冲区时,第二次分配发生在到_string()
中
根据上下文,有几种方法可以避免这种情况。最简单的方法是避免调用字符串
,继续使用&str
而不是字符串
。如果这不适用于您,您还可以编写自己的函数来修剪字符串末尾的换行符:
fn trim_newline(s: &mut String) {
if s.ends_with('\n') {
s.pop();
if s.ends_with('\r') {
s.pop();
}
}
}
这并不等同于原始代码中的trim()
,因为它只从字符串的末尾删除换行符,而不是从字符串的任意一端删除空格
另一种选择是使用lines()
迭代器,该迭代器从stdin生成行,而不使用其终止换行符:
use std::io::{BufRead};
let stdin = std::io::stdin();
for line in stdin.lock().lines() {
let line = line?; // line is a Result<String, io::Error>
}
使用std::io::{BufRead};
设stdin=std::io::stdin();
对于stdin.lock().lines()中的行{
让line=line?;//line是结果
}
我只看到代码中可以改进的一个方面:分配两个字符串来读取一行。第一次分配发生在将该行读入缓冲区时,第二次分配发生在到_string()
中
根据上下文,有几种方法可以避免这种情况。最简单的方法是避免调用字符串
,继续使用&str
而不是字符串
。如果这不适用于您,您还可以编写自己的函数来修剪字符串末尾的换行符:
fn trim_newline(s: &mut String) {
if s.ends_with('\n') {
s.pop();
if s.ends_with('\r') {
s.pop();
}
}
}
这并不等同于原始代码中的trim()
,因为它只从字符串的末尾删除换行符,而不是从字符串的任意一端删除空格
另一种选择是使用lines()
迭代器,该迭代器从stdin生成行,而不使用其终止换行符:
use std::io::{BufRead};
let stdin = std::io::stdin();
for line in stdin.lock().lines() {
let line = line?; // line is a Result<String, io::Error>
}
使用std::io::{BufRead};
设stdin=std::io::stdin();
对于stdin.lock().lines()中的行{
让line=line?;//line是结果
}
此代码中是否有不正确的地方,或者您正在寻找最惯用的方法?@Cerberus是的,我只是在寻找更惯用的方法。您对您的方法有什么不喜欢的地方吗?否则很难提出改进建议,因为我们不知道该解决什么问题。我能看到的唯一问题是,您为阅读一行代码分配了两次,我将添加一个如何避免这种情况的答案。这段代码中是否有不正确的地方,或者您正在寻找最惯用的方法?@Cerberus是的,我只是在寻找一种更惯用的方法。您不喜欢您的方法吗?否则很难提出改进建议,因为我们不知道该解决什么问题。我能看到的唯一问题是,您为阅读一行分配了两次,我将添加一个如何避免这种情况的答案。