无法修剪从TCP流接收的字符串

Maz*_*yod 3 string rust

我今天刚刚开始学习Rust,但是我已经编程了一段时间......但是,我似乎无法在Rust中修剪一个简单的字符串.我试着用切片&[0 .. length - 2],trim(),trim_right(),似乎没有任何帮助...

所以,stream这是一个TCPStream,即使我正在使用trim(),以下代码的输出是:

# client
$ nc localhost 3500
hello
$ ...
# server output
Received string: hello
, Rust! ..
Run Code Online (Sandbox Code Playgroud)
let mut buffer = [0; 2048];
let _ = stream.read(&mut buffer);
let s = format!("{}, Rust!", String::from_utf8_lossy(&buffer).trim());

println!("Received string: {} ..", s);
Run Code Online (Sandbox Code Playgroud)

更新:似乎from_utf8_lossy正在返回一个长度为2048的字符串!当我发送一个足够长的字符串并切片时,它最终会起作用......

以防万一,这里是完整的来源:

https://gist.github.com/Mazyod/8f6807e2c859b3457eaa4bcf24d5d703

mca*_*ton 9

那么,这里发生了什么?让我们看看这个例子:

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));
}
Run Code Online (Sandbox Code Playgroud)

由此可见:

"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}"
Run Code Online (Sandbox Code Playgroud)

难怪trim不行不通!

Read::read 返回读取的字符数,使用它,不要忽略它!


Nei*_*kos 9

使用gist中提供的代码,这似乎是错误的:

  1. Read::read 返回您忽略的结果,这可能是以后的问题.
  2. 你正在给String::from_utf8_lossy整个缓冲区,即使它可能只是有点满.那么从最后扫描可能会发生什么,但你的字符串都在开头.想象一下像这样的缓冲区:['H','e','\n',\0,'4','d']你只放入"He\n"但不关心String并且仍然使用缓冲区的整个长度.

要修复它,你可以这样做:

let n = try!(stream.read(&mut buffer));
let s = format!("{}, Rust!", String::from_utf8_lossy(&buffer[0..n]).trim());

println!("Received string: {} ..", s);
Run Code Online (Sandbox Code Playgroud)

它使用Range语法将切片截取到最后一个实际读取的字符.

  • 作为旁注,通常难以忽略错误,处理错误或冒泡它们.(以`try!`为例) (2认同)