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

String 无法修剪从TCP流接收的字符串,string,rust,String,Rust,我今天刚开始学习Rust,但我已经编程一段时间了。。。然而,我似乎无法修剪一根生锈的简单绳子。我试着使用切片&[0..length-2],trim(),trim\u right(),似乎没有任何帮助 因此,stream这里有一个TCPStream,即使我使用的是trim(),以下代码的输出是: #客户端 $nc本地主机3500 你好 $ ... #服务器输出 收到字符串:你好 ,生锈。。 更新:似乎来自\u utf8\u lossy的返回的字符串长度为2048!当我发送一个足够长的字符串,并

我今天刚开始学习Rust,但我已经编程一段时间了。。。然而,我似乎无法修剪一根生锈的简单绳子。我试着使用切片
&[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);