Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 修剪'\n';从io::stdin().读取行()?_String_Rust_Newline - Fatal编程技术网

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是的,我只是在寻找一种更惯用的方法。您不喜欢您的方法吗?否则很难提出改进建议,因为我们不知道该解决什么问题。我能看到的唯一问题是,您为阅读一行分配了两次,我将添加一个如何避免这种情况的答案。