string - 从 String 中删除单个尾随换行符而不进行克隆

标签 string rust

我写了一个函数来提示输入并返回结果。在此版本中,返回的字符串包含来自用户的尾随换行符。我想返回删除该换行符(并且只是该换行符)的输入:

fn read_with_prompt(prompt: &str) -> io::Result<String> {
    let stdout = io::stdout();
    let reader = io::stdin();
    let mut input = String::new();
    print!("{}", prompt);
    stdout.lock().flush().unwrap();
    reader.read_line(&mut input)?;

    // TODO: Remove trailing newline if present
    Ok(input)
}

只删除单个尾随换行符的原因是此函数还将用于提示输入密码(适当使用 termios 停止回显),如果某人的密码有尾随空格,则应保留此空格。

在对如何实际删除字符串末尾的单个换行符大惊小怪之后,我最终使用了trim_right_matches。 .然而,这会返回一个 &str。我尝试使用 Cow 来处理这个问题,但错误仍然表明 input 变量的生命周期不够长。

fn read_with_prompt<'a>(prompt: &str) -> io::Result<Cow<'a, str>> {
    let stdout = io::stdout();
    let reader = io::stdin();
    let mut input = String::new();
    print!("{}", prompt);
    stdout.lock().flush().unwrap();
    reader.read_line(&mut input)?;

    let mut trimmed = false;
    Ok(Cow::Borrowed(input.trim_right_matches(|c| {
        if !trimmed && c == '\n' {
            trimmed = true;
            true
        }
        else {
            false
        }
    })))
}

错误:

error[E0515]: cannot return value referencing local variable `input`
  --> src/lib.rs:13:5
   |
13 |       Ok(Cow::Borrowed(input.trim_right_matches(|c| {
   |       ^                ----- `input` is borrowed here
   |  _____|
   | |
14 | |         if !trimmed && c == '\n' {
15 | |             trimmed = true;
16 | |             true
...  |
20 | |         }
21 | |     })))
   | |________^ returns a value referencing data owned by the current function

基于 previous questions along these lines这似乎是不可能的。分配新字符串的唯一选择是删除尾随换行符吗?似乎应该有一种方法可以在不复制字符串的情况下修剪字符串(在 C 中,您只需将 '\n' 替换为 '\0')。

最佳答案

您可以使用 String::popString::truncate :

fn main() {
    let mut s = "hello\n".to_string();
    s.pop();
    assert_eq!("hello", &s);

    let mut s = "hello\n".to_string();
    let len = s.len();
    s.truncate(len - 1);
    assert_eq!("hello", &s);
}

关于string - 从 String 中删除单个尾随换行符而不进行克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37888042/

相关文章:

C++:空字符如何在 std::string 中工作?

python - 有水母的文档吗?

android - onItemClick 获取数组上项目的 ID 或名称

struct - 为什么我不能多次调用变异函数?

rust - 我如何获得对解构结构的引用或失败?

io - 在 Rust 中是否有丢弃输入的标准方法?

C++字符串输出笑脸

c++ - 如何从字符串中提取特定元素?

c - 如何通过 FFI 将 C 字符串转换为 Rust 字符串并返回?

rust - 在 S<T> 上使用通用特征强制我让 T 比 S 长寿