create_dir() 给文件夹添加奇怪的问号,当文件夹名称使用输入

create_dir() adds weird question mark to the folder, when the folder name uses input

在我的程序的一部分中,它创建了一个以用户提供的输入命名的文件夹:

        println!("\nName your world\n");

        let mut name = String::new();

        io::stdin().read_line(&mut name).expect("Error Reading Input!");

        let mut name_path = format!("saves/{}",name);

        fs::create_dir(Path::new(&name_path)).unwrap();
        println!("\nWorld Created!\n");

它 运行 成功了(我创建了一个名为 test_world 的文件夹),但是当我查看该文件夹时,我注意到它被命名为:test_world?我多次使用 运行 这个程序,文件夹名称不同,但结果是一样的(X?)。 Example

read_line() 包括尾随换行符(如果存在)。例如,尝试 运行 此代码:

fn main() {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    println!("Hello, world! '{}'", s);
}

要解决此问题,您可以使用 .trim() 删除输入开头和结尾的空格:https://doc.rust-lang.org/std/primitive.str.html#method.trim

这可能是因为字符串末尾附加了换行符。您应该调用 .pop() 来删除尾随的换行符,或者更好的是调用 .trim() 函数来删除所有前后的空白字符。

顺便说一句,你应该使用 PathBuf 来处理路径 这是代码

use std::{io, fs, path::PathBuf};

fn main() {
    println!("\nName Your World\n");
    let mut buffer = String::new();
    io::stdin().read_line(&mut buffer).unwrap();
    let trimmed_path = buffer.trim();

    let mut path = PathBuf::from("saves");
    path.push(trimmed_path);

    fs::create_dir(&path).unwrap();
}