Rust 在循环中使用read_行时的奇怪行为

Rust 在循环中使用read_行时的奇怪行为,rust,Rust,我在Rust中的第一个程序应该以字符的形式从用户那里获取输入,C或F: use std::io; fn main() { let mut srcunit = String::new(); let mut switch = true; while switch { println!("source unit? F or C?"); io::stdin().read_line(&mut srcunit).expect(

我在Rust中的第一个程序应该以字符的形式从用户那里获取输入,C或F:

use std::io;

fn main() {
    let mut srcunit = String::new();

    let mut switch = true;
    while switch {
        println!("source unit? F or C?");
        io::stdin().read_line(&mut srcunit).expect(
            "failed to read src unit",
        );

        if srcunit.trim() == "F" || srcunit.trim() == "C" {
            println!("doing things right with {}", srcunit);
            switch = false;
        } else {
            println!("either F or C, not {}", srcunit);
        }
    }

    println!("you pressed {}", srcunit);
}
当我启动程序并按F或C时,它工作正常,所以我跳过这里。当我按下另一个角色时,奇怪的部分出现了。我希望我的程序再次请求F或C,直到我按下其中一个字符。当我这样做时,它应该离开while循环并告诉我按下了什么

源单元?F还是C?
G
要么是F,要么是C,不是G//到目前为止还不错
来源单位?F还是C?
F
F或C,而不是G//为什么F没有分配给srcunit变量?它现在应该离开环路了。
F//为什么打印这行?我没有按任何键或使用println函数/宏来执行此操作
来源单位?F还是C?
v
要么是F,要么是C,不是G//还是G,wtf
再说一遍,为什么要打印这两行?它存储在哪里,我以前按过F?
v
来自:

读取所有字节,直到到达换行符(0xA字节),然后将它们追加到提供的缓冲区中

(强调我的。)在读取下一行之前,您需要清除字符串,例如通过调用字符串上的方法,否则答案将累积在变量中

或者,您可以在循环中定义变量(但效率稍低,因为这样,
String
将无法为下一个答案重新使用已分配的存储,它必须重新分配和重新分配)


另见,最近被问到。看起来这是一个常见的陷阱。

换句话说,打印这些额外的行是因为它们是
srcunit
的一部分
read_line
不断将新数据添加到它的末尾。中的关键示例(希望我得到了正确的链接)是变量在循环中声明,因此它会在每次迭代中自动重新创建。