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

时间:2016-10-05 16:41:55

标签: string rust

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

所以,stream这里是TCPStream,即使我使用trim(),以下代码的输出也是:

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

println!("Received string: {} ..", s);

更新:似乎from_utf8_lossy返回的字符串长度为2048!当我发送一个足够长的字符串并切片时,它终于有效......

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

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

2 个答案:

答案 0 :(得分: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));
}

这表明:

"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不起作用!

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

答案 1 :(得分:9)

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

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

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

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