String 无法修剪从TCP流接收的字符串
我今天刚开始学习Rust,但我已经编程一段时间了。。。然而,我似乎无法修剪一根生锈的简单绳子。我试着使用切片String 无法修剪从TCP流接收的字符串,string,rust,String,Rust,我今天刚开始学习Rust,但我已经编程一段时间了。。。然而,我似乎无法修剪一根生锈的简单绳子。我试着使用切片&[0..length-2],trim(),trim\u right(),似乎没有任何帮助 因此,stream这里有一个TCPStream,即使我使用的是trim(),以下代码的输出是: #客户端 $nc本地主机3500 你好 $ ... #服务器输出 收到字符串:你好 ,生锈。。 更新:似乎来自\u utf8\u lossy的返回的字符串长度为2048!当我发送一个足够长的字符串,并
&[0..length-2]
,trim()
,trim\u right()
,似乎没有任何帮助
因此,stream
这里有一个TCPStream
,即使我使用的是trim()
,以下代码的输出是:
#客户端
$nc本地主机3500
你好
$ ...
#服务器输出
收到字符串:你好
,生锈。。
更新:似乎来自\u utf8\u lossy的
返回的字符串长度为2048!当我发送一个足够长的字符串,并采取切片,它终于工作
以防万一,以下是完整的来源:
那么,这里发生了什么?
让我们看看这个例子:
fn main() {
let mut buffer = [0; 32];
buffer[0] = b'H';
buffer[1] = b'i';
buffer[2] = b'!';
buffer[3] = b'\n';
println!("{:?}", String::from_utf8_lossy(&buffer));
}
这表明:
"Hi!\n\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}"
难怪trim
不起作用
返回读取的字符数,使用它,不要忽略它 使用要点中提供的代码,这似乎是错误的:
返回您忽略的结果,这可能是以后的问题
您正在为整个缓冲区提供String::from\u utf8\u lossy
,即使它可能只是有点满。所以,如果它从末尾扫描,那么会发生什么,但是字符串都在开头。
想象一个这样的缓冲区:['H'、'e'、'\n'、\0、'4'、'd']
您只在中输入了“He\n”
,但字符串并不在意,仍然使用整个缓冲区的长度
要修复它,您可以执行以下操作:
let n = try!(stream.read(&mut buffer));
let s = format!("{}, Rust!", String::from_utf8_lossy(&buffer[0..n]).trim());
println!("Received string: {} ..", s);
它使用语法将一个片段提取到最后一个实际读取的字符。@Neikos我正在使用nc
将字符串“hello”发送到写下,以验证它是否正在读取某些内容,对吗?是的,我误读了代码,没有看到您使用格式
而不是println
,作为旁注,忽略错误、处理错误或冒充错误通常是个坏主意。(以试试!
为例)这两个答案都很好,但因为这是第一个。。。我还发现了read\u line
,这可能不需要处理这种低级表示。
let n = try!(stream.read(&mut buffer));
let s = format!("{}, Rust!", String::from_utf8_lossy(&buffer[0..n]).trim());
println!("Received string: {} ..", s);