2016-05-30 8 views
10

La macro println! in Rust lascia sempre un carattere di fine riga alla fine di ogni output. Per esempioCome si stampa l'output senza una nuova riga finale in Rust?

println!("Enter the number : "); 
io::stdin().read_line(&mut num); 

dà l'uscita

Enter the number : 
56 

Non voglio l'input dell'utente 56 di essere su una nuova linea. Come faccio a fare questo?

risposta

11

È possibile utilizzare lo print! macro.

print!("Enter the number : "); 
io::stdin().read_line(&mut num); 

Attenzione:

noti che stdout è spesso linea-tamponato per default quindi potrebbe essere necessario utilizzare io::stdout().flush() per garantire la potenza viene emessa immediatamente.

+11

"* Si noti che stdout viene spesso linea-tamponata di default quindi potrebbe essere necessario usare' io :: stdout() flush() 'per garantire la potenza viene emessa immediatamente *.". - https: //doc.rust-lang.org/std/macro.print!.html – ArtemGr

+0

@ArtemGr: In C++ (e CI pensano), quando si tenta di leggere da 'stdin', il buffer' stdout' viene immediatamente svuotato. Mi sarei aspettato (forse erroneamente) lo stesso comportamento di Rust, e l'esempio presentato sulla pagina 'stampa!' Non viene letto da 'stdin', quindi non è conclusivo in questo senso ... hai altre informazioni? –

+0

@MatthieuM. Ho fatto un semplice test su Windows e Linux con Rust nightly e non c'è ** nessun flusso di stdout ** che si verifica nel codice della risposta, ad es. "Immetti il ​​numero:" viene stampato solo ** dopo che il programma termina ** e non prima che si verifichi 'read_line'. – ArtemGr

5

È più difficile di quanto sembrerebbe a prima vista. Altre risposte menzionano la macro print! ma non è proprio così semplice. Probabilmente dovrai svuotare lo stdout, poiché potrebbe non essere immediatamente scritto sullo schermo. flush() è un tratto che fa parte di std::io::Write, quindi è necessario che lo strumento funzioni correttamente (questo è un errore molto facile all'inizio).

use std::io; 
use std::io::Write; // <--- bring flush() into scope 


fn main() { 
    println!("I'm picking a number between 1 and 100..."); 

    print!("Enter a number: "); 
    io::stdout().flush().unwrap(); 
    let mut val = String::new(); 

    io::stdin().read_line(&mut val) 
     .expect("Error getting guess"); 

    println!("You entered {}", val); 
} 
Problemi correlati