Perché l’input dell’utente dallo stdin non viene eseguito correttamente?

Sto cercando di ottenere l’input del sistema e controllare se l’utente ha inserito sì o no. Sto facendo la mia conversione di stringhe sbagliata o qualcosa del genere? Il blocco if non viene eseguito.

use std::io; fn main() { let mut correct_name = String::new(); io::stdin().read_line(&mut correct_name).expect("Failed to read line"); if correct_name == "y" { println!("matched y!"); // Do something } else if correct_name == "n" { println!("matched n!"); // Do something else } } 

read_line include la fine riga che termina nella stringa restituita. Aggiungi .trim_right_matches("\r\n") alla definizione di nome correct_name per rimuovere la fine riga che termina.

Invece di trim_right_matches , ti consiglio di utilizzare trim_right o anche meglio, basta trim :

 use std::io; fn main() { let mut correct_name = String::new(); io::stdin().read_line(&mut correct_name).expect("Failed to read line"); let correct_name = correct_name.trim(); if correct_name == "y" { println!("matched y!"); // Do something } else if correct_name.trim() == "n" { println!("matched n!"); // Do something else } } 

Quest’ultimo caso gestisce molti tipi di spazi bianchi:

Restituisce una sezione di stringa con gli spazi bianchi iniziali e finali rimossi.

“Spazio bianco” è definito in base ai termini di White_Space Proprietà derivata Unicode.

Quindi Windows / Linux / macOS non dovrebbe avere importanza.


Puoi anche usare la lunghezza del risultato tagliato per troncare la String originale, ma in questo caso dovresti usare solo trim_right !

 let trimmed_len = correct_name.trim_right().len(); correct_name.truncate(trimmed_len); 

È ansible utilizzare la cassa chomp-nl che fornisce una funzione chomp che restituisce una sezione stringa senza i caratteri newline.

C’è anche una caratteristica ChompInPlace se preferisci farlo sul posto.

Disclaimer: sono l’autore di questa libreria.