【问题标题】:What is a better way to trim '\n' from io::stdin().read_line()? [closed]从 io::stdin().read_line() 修剪 '\n' 的更好方法是什么? [关闭]
【发布时间】:2019-01-28 03:35:39
【问题描述】:

下面的代码对我来说没问题。

let mut buffer = String::new();
io::stdin().read_line(&mut buffer);
buffer = buffer.trim().to_string();

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

【问题讨论】:

  • 这段代码对你来说有什么不正确的地方,还是你正在寻找最惯用的方式?
  • @Cerberus 是的,我只是在寻找一种更惯用的方式。
  • 您的方法有什么不满意的地方吗?否则很难提出改进建议,因为我们不知道要解决什么问题。我能看到的唯一问题是您为读取一行分配了两次,我将添加一个如何避免这种情况的答案。

标签: string rust newline


【解决方案1】:

我只看到您的代码中可以改进的一个方面:您分配 两个 字符串来读取一行。第一次分配发生在将行读入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() 迭代器,该迭代器从标准输入生成行而没有终止换行符:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2015-04-05
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多