2016-10-05 8 views
2

今日はRustを学び始めましたが、今はしばらくプログラミングしています...しかし、Rustの単純な文字列をトリミングすることはできません。TCPストリームから受け取った文字列を切り捨てることができません

# client 
$ nc localhost 3500 
hello 
$ ... 
# server output 
Received string: hello 
, Rust! .. 
:私は、だから、ここ streamTCPStreamある、と私は trim()を使用していたとしても、次のコードの出力は

... &[0 .. length - 2]trim()trim_right()をスライス使用してみましたが、何も助けていないようにみえ


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

@Neikos "hello"という文字列を 'nc'を使って書き出しています。これは何かを読み取っていることを確認していますか? – Mazyod

+0

はい、私はコードを誤読し、 'println'の代わりに' format'を使用していませんでした – Neikos

答えて

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読み取り文字の数を返します。無視しないでください。

+0

両方の回答は素晴らしいですが、これが最初です...私は 'read_line'も発見しました。低レベル表現。 – Mazyod

9

これは間違っているように思わ要旨で提供されているコードを使用する:

  1. Read::readは、あなたが無視している結果を返し、これが後に問題がある可能性があります。
  2. 少しでもいっぱいになっていても、バッファ全体にはString::from_utf8_lossyが与えられています。だから、終わりからスキャンすることが起こるかもしれませんが、あなたの文字列はすべて最初です。 ['H','e','\n',\0,'4','d']のようなバッファーを想像してみてください。"He\n"に入れるだけですが、Stringは気にせずにバッファーの全長を使います。アップ最後実際に読み込まれた文字のスライスを取るためにRange構文を使用しています

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

    :あなたはこのような何かを行うことができ、それを修正するには

+2

補足として、エラーをハードに無視したり、処理したり、バブルアップしたりすることは、一般的には悪い考えです。 (例えば 'try!'で) – Neikos

関連する問題