我今天刚刚开始学习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
答案 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中提供的代码,这似乎是错误的:
Read::read
会返回您忽略的结果,这可能会在以后出现问题。String::from_utf8_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);
使用Range语法将切片截取到最后一个实际读取的字符。