rust 尝试从标准输入中获取用户名和密码并删除\r\n

92vpleto  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(111)

我正在看例子,但它们都只需要 * 一 * 行管道/输入到我的rust程序,但我需要2行或更多的字符串,这样我就可以删除\r\n或\n或\r和最后一行。行,所以基本上我需要他们在字符串,所以我可以对他们的工作。这是我的剪刀

let mut buffer = "".to_string();

    io::stdin().read_to_string(&mut buffer)?;
    print!("{}",remove(buffer));
// remove() is  the fn where I am trying to work with the Strings
...

字符串
上面我从标准输入中阅读了我的程序中的所有内容。cat test.txt > cargo run that works..但我现在输入

ClientAuthname: user\r\n
ClientPassword: pass\r\n
.\r\n


所以我在remove()下做了20多个函数,但似乎都没做对,rust总是抱怨,我测试了很多例子,但它们都是针对u* 类型或string类型等的。当使用字符串可变或不我总是得到的问题。我尝试的一些解决方案,例如Remove single trailing newline from String without cloning
我的案子没什么进展。如果有人能给予我一把并给我一个解释,我将不胜感激,所以我学会了这一点,因为我做了很多unix系统编程的C/Go和移动我的程序生 rust 。
谢谢[编辑]因为人们希望我浪费文字和发布我尝试的例子,这是我到目前为止尝试过的14个例子中的3个

/*
fn remove(arg: String) -> String {
    let newarg = arg.trim_end().to_string();
    return newarg;
}
*/
/*
fn parse(s: &mut String) -> String {
    if s.ends_with('\n') {
        s.pop();
        if s.ends_with('\r') {
            s.pop();
        }
    }
    return s.to_string();
}
*/

fn parse(s: &mut String) -> String {
    s.strip_suffix("\r\n").or(s.strip_suffix("\n")).unwrap_or(s);
    return s.to_string();
}


没有工作.他们都无法删除\r\n或\n:(
那么我有什么标准输入呢?我看到的都试过了!这一切https://doc.rust-lang.org/stable/std/io/struct.Stdin.html#method.read_line我也尝试了所有这些!How to capture the output of a process piped into a Rust program?
我可以继续!这是C语言做起来超级简单。我不知道为什么我不能从另一个程序中得到输出的native unix方式与一个简单的管道,如回声“密码\r\n”|cargo运行并删除“\r\n”如果它来自另一个程序的stdin,则不起作用。

use std::io;

let lines = io::stdin().lines();
for line in lines {
    println!("got a line: {}", line.unwrap());
}


为什么我不能添加parse()到这一行!!!字符串,并使用我找到的任何示例获取\r\n remove!我改变两者,标准输入的方式和函数删除,我试过.trim()我试过.pop()我试过.truncate()我试过.strip_suffix(“\r\n”)!一切!不能有人只是写一个小剪,将做正是我需要的,因为没有存在任何东西的工作。或者至少告诉我应该怎么做,这样我就不会一直尝试,尝试,尝试我看到的一切。我差一点就抛弃了所有1000多个工作代码,因为一些简单的事情,比如从另一个unix程序中抓取和操作字符串,自从Unix基于管道工作以来,我已经在C中做了数千次。

fjnneemd

fjnneemd1#

我将首先关注这一部分:
我不知道为什么我不能从另一个程序中得到输出的native unix方式与一个简单的管道,如回声“密码\r\n”|货物运行并删除“\r\n”
当运行echo "Password\r\n"时,\r\n * not* 被解释为回车和换行符。它们被解释为文字\,然后是r,然后是\,然后是n。这是四个ASCII字符:\x5c\x72\x5c\x6e
详情请参见:Echo newline in Bash prints literal \n
当您在Rust代码中编写"\r\n"时,它们被解释为回车和换行符。这是两个ASCII字符:\x0d\x0a

  • 他们不一样 *

要让Rust代码匹配echo输出,需要对转义字符\进行转义,如"\\r\\n"。下面是一个演示:

fn main() {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).unwrap();

    // show the raw debug output for the line
    let line = &line;
    dbg!(line);

    // remove the newline character preserved from `.read_line()`
    let line = line.trim_end();
    dbg!(line);

    // remove the trailing literal "\r\n" you're expecting
    let line = line.trim_end_matches("\\r\\n");
    dbg!(line);
}

个字符
这同样适用于你的cat例子,你的文件没有CR(\r)和LF(\n)控制字符,你发送的是文字\r\n(然后可能是真实的的\n,因为有一个换行符)。
总而言之,* 您要么误解了文档,要么误解了您的工具 *。您将所遵循的规范(在注解中)链接为:里面写着:
[...]它将标准输入上的信息作为key: value行的序列传递。每行以CRLF [...]结束
因此,通过echo "Password\r\n"模拟这一点是 * 不正确 *,不符合规范。要使用echo做正确的事情,您可以传递-e(如上面的SO链接所示),您将看到行为完全不同:

> echo -e "Password\r\n" | cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/temp`
[src/main.rs:7] line = "Password\r\n"
[src/main.rs:11] line = "Password"
[src/main.rs:15] line = "Password"


因此,一个简单的.trim()/.trim_end()就足以完成这项工作。

wmvff8tz

wmvff8tz2#

我一直在测试这个解决方案。只需要读一次。这将读取完整的输出,并删除所有\r\n,并将所有字符串放入Vec中

use std::io::Read;

fn parse() -> std::io::Result<Vec<String>> {
    let mut line = String::new();
    std::io::stdin().read_to_string(&mut line)?;

    // show the raw debug output for the line
    let line = &line;
    dbg!(line);

    // remove the newline character preserved from `.read_line()`
    let line = line.trim_end();
    dbg!(line);

    // remove the trailing literal "\r\n" you're expecting
    let lines: Vec<String> = line.split("\r\n").map(|str| str.to_string()).collect();
    dbg!(&lines);

    Ok(lines)
}

fn main() {
    let lines = match parse() {
        Ok(val) => val,
        Err(err) => panic!("Some input error : {}", err),
    };

    print!("Lines : {lines:?}");
    // use them here
}

字符串


的数据



%在shell中的意思是End of file,因此它不接受\r\n char。
编辑:一些改变,使它与多行工作,并把它放在一个向量。

相关问题