我今天刚刚开始学习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
那么,这里发生了什么?让我们看看这个例子:
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 返回读取的字符数,使用它,不要忽略它!
使用gist中提供的代码,这似乎是错误的:
Read::read 返回您忽略的结果,这可能是以后的问题.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语法将切片截取到最后一个实际读取的字符.
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |