我正在看例子,但它们都只需要 * 一 * 行管道/输入到我的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中做了数千次。
2条答案
按热度按时间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"
。下面是一个演示:个字符
这同样适用于你的
cat
例子,你的文件没有CR(\r
)和LF(\n
)控制字符,你发送的是文字\
,r
,\
和n
(然后可能是真实的的\n
,因为有一个换行符)。总而言之,* 您要么误解了文档,要么误解了您的工具 *。您将所遵循的规范(在注解中)链接为:里面写着:
[...]它将标准输入上的信息作为
key: value
行的序列传递。每行以CRLF [...]结束因此,通过
echo "Password\r\n"
模拟这一点是 * 不正确 *,不符合规范。要使用echo
做正确的事情,您可以传递-e
(如上面的SO链接所示),您将看到行为完全不同:型
因此,一个简单的
.trim()
/.trim_end()
就足以完成这项工作。wmvff8tz2#
我一直在测试这个解决方案。只需要读一次。这将读取完整的输出,并删除所有
\r
和\n
,并将所有字符串放入Vec中字符串
的数据
的
%
在shell中的意思是End of file
,因此它不接受\r
或\n
char。编辑:一些改变,使它与多行工作,并把它放在一个向量。