Closed. This question is opinion-based。它当前不接受答案。












想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

2年前关闭。



Improve this question




下面的代码为我工作正常。
let mut buffer = String::new();
io::stdin().read_line(&mut buffer);
buffer = buffer.trim().to_string();

'\n'修剪read_line的更好/正确的方法是什么?

最佳答案

我只看到可以在您的代码中进行改进的一个方面:分配两个字符串以读取一行的事实。第一个分配发生在将行读入buffer时,第二个分配发生在to_string()中。

根据上下文,有几种方法可以避免这种情况。最简单的方法是简单地避免调用to_string,并继续使用&str而不是String。如果这对您不起作用,您还可以编写自己的函数以在字符串末尾修剪换行符:

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>
}

关于string - 从io::stdin()。read_line()修剪 '\n'的更好方法是什么? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54395227/

10-11 22:13
查看更多