2015-05-20 2 views
9

Existierende Antworten, die ich gefunden habe, basieren alle auf from_str (wie Reading in user input from console once efficiently), aber anscheinend from_str(x) hat sich in x.parse() in Rust 1.0 geändert. Als Neuling ist es nicht offensichtlich, wie die ursprüngliche Lösung unter Berücksichtigung dieser Änderung angepasst werden sollte.Wie kann ich eine Integer-Eingabe des Benutzers in Rust 1.0 lesen?

Was ist der einfachste Weg, um von Rust 1.0 eine ganzzahlige Eingabe vom Benutzer zu erhalten?

Antwort

19

Und hier eine Version mit allen optionalen Typenannotationen und Fehlerbehandlung, die für Anfänger (wie ich) vielleicht nützlich ist:

use std::io; 

fn main() {  
    let mut input_text = String::new(); 
    io::stdin() 
     .read_line(&mut input_text) 
     .expect("failed to read from stdin"); 

    let trimmed = input_text.trim(); 
    match trimmed.parse::<u32>() { 
     Ok(i) => println!("your integer input: {}", i), 
     Err(..) => println!("this was not an integer: {}", trimmed) 
    }; 
} 
6

wahrscheinlich einfachste Teil wäre text_io zu verwenden und schreiben:

// read until a whitespace and try to convert what was read into an i32 
    let i: i32 = read!(); 

Hinweis: Wenn Sie jedoch mehr als einen Wert gleichzeitig lesen müssen, könnten Sie jede Nacht benötigen Rost.

+0

Ich denke, es läuft auf stabil, wenn Sie nur einen Wert zu einem Zeitpunkt lesen müssen. –

+0

'text_io' dev hier. @VladimirMatveev hat recht, 'text_io' läuft auf stabil, wenn Sie nicht Tupel lesen, sondern nur einen einzigen Wert pro' read!() 'Aufruf. Es erfordert tatsächlich nächtliche für mehrere Werte. Ich werde die Github-Beschreibung aktualisieren. –

4

parse ist mehr oder weniger das Gleiche; es ist read_line das ist jetzt unangenehm.

use std::io; 

fn main() { 
    let mut s = String::new(); 
    io::stdin().read_line(&mut s).unwrap(); 

    match s.trim_right().parse::<i32>() { 
     Ok(i) => println!("{} + 5 = {}", i, i + 5), 
     Err(_) => println!("Invalid number."), 
    } 
} 
3

Hier sind ein paar Möglichkeiten (Rust 1.7):

use std::io; 

fn main() { 
    let mut n = String::new(); 
    io::stdin() 
     .read_line(&mut n) 
     .expect("failed to read input."); 
    let n: i32 = n.trim().parse().expect("invalid input"); 
    println!("{:?}", n); 

    let mut n = String::new(); 
    io::stdin() 
     .read_line(&mut n) 
     .expect("failed to read input."); 
    let n = n.trim().parse::<i32>().expect("invalid input"); 
    println!("{:?}", n); 

    let mut n = String::new(); 
    io::stdin() 
     .read_line(&mut n) 
     .expect("failed to read input."); 
    if let Ok(n) = n.trim().parse::<i32>() { 
     println!("{:?}", n); 
    } 
} 

Diese ersparen Ihnen die Zeremonie der Mustererkennung, ohne von zusätzlichen Bibliotheken abhängig zu sein.

+0

Komm schon, es ist deutlich anders, und eine vollständige Antwort erleichtert es dem Leser. – qed

+0

Es sieht ziemlich identisch mit [die akzeptierte Antwort] (http://stackoverflow.com/a/30355925/155423) für mich aus. – Shepmaster

+0

Ja, Sie müssen eine Zeichenfolge vom Benutzer abrufen und speichern, dass in einer Variablen dieser Teil identisch ist. Der Parsing-Teil ist prägnanter, wie in meiner Antwort erklärt. – qed

Verwandte Themen