【问题标题】:How to ignore the line break while printing a string read from stdin?打印从标准输入读取的字符串时如何忽略换行符?
【发布时间】:2017-04-23 03:33:58
【问题描述】:

我尝试编写一些从标准输入读取名称并打印出来的代码。问题是打印变量后立即换行,变量后面的字符打印在下一行:

use std::io;

fn main() {
    println!("Enter your name:");
    let mut name = String::new();
    io::stdin().read_line(&mut name).expect("Failed To read Input");
    println!("Hello '{}'!", name);
}

“!”打印在下一行,这不是预期的位置。

【问题讨论】:

    标签: input printing rust


    【解决方案1】:

    使用.trim() 删除字符串上的空格。这个例子应该可以工作。

    use std::io;
    
    fn main() {
        println!("Enter your name:");
        let mut name = String::new();
        io::stdin().read_line(&mut name).expect("Failed To read Input");
        println!("Hello '{}'!", name.trim());
    }
    

    还有trim_start().trim_end() 如果您只需要从字符串的一侧删除空格更改。

    【讨论】:

    • io::stdin().read_line() 不会对读取的行进行预处理,因此最后会保留一个 '\n'。所以它需要额外的 trim() 调用,虽然理想情况下 read_line() 顾名思义应该自己这样做,以便为用户提供更好的 api。
    【解决方案2】:

    如果您只想删除最后一个字符(在这种情况下是换行符),您应该使用.pop() 而不是.trim()

    当您使用.trim() 时,前导和尾随空格将被删除,因此字符串开头和结尾的空格、制表符、换行符和其他空格将被删除。

    use std::io;
    
    fn main() {
        println!("Enter your name:");
        let mut name = String::new();
        io::stdin().read_line(&mut name).expect("Failed To read Input");
        name.pop();
        println!("Hello '{}'!", name);
    }
    

    【讨论】:

    • 不处理换行符为多个字符的情况,比如\r\n
    • 我相信trim_end() 是解决这个问题的正确方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多