2015-01-05 4 views
4

Я пытаюсь получить системный ввод и проверить, введен ли пользователь в да или нет. Я неправильно делаю преобразование строк или что-то в этом роде? Блок if не выполняется.Почему мой пользователь не вводит корректное соответствие stdin?

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 
    } 
} 

ответ

4

read_line содержит завершающую новую строку в возвращаемой строке. Добавьте .trim_right_matches("\r\n") к вашему определению correct_name, чтобы удалить завершающую строку новой строки.

+0

Что относительно Windows, должно ли оно быть «\ r \ n»? – ArtemGr

+0

Это говорит мне, что bool' не реализован для типа '& str, когда я добавляю, что – Joe

+0

Я понял, что он должен идти в инструкции if после того, как я посмотрел документы. Благодаря! – Joe

11

Вместо trim_right_matches, я бы рекомендовал использовать trim_right или даже лучше, просто 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 
    } 
} 

Этот последний случай обрабатывает множество типов пробельных:

Возвращает кусок строки с ведущими и удаленные пробелы удалены.

«Пробел» определяется в соответствии с условиями производного базового свойства Unicode White_Space.

Так что Windows/Linux/macOS не имеет значения.


Вы также можете использовать длину обрезанного результата, чтобы укоротить оригинальную String, но в этом случае вы должны использовать только trim_right!

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

Вы можете использовать chomp-nl crate, который обеспечивает chomp function, который возвращает фрагмент строки без перевода строки символов.

Существует также trait ChompInPlace, если вы предпочитаете делать это на месте.

Отказ от ответственности: Я являюсь автором этой библиотеки.

+0

Какая польза/разница от 'trim' /' trim_right'/'trim_right_matches'? – Shepmaster

+1

Это функция 'trim_right_matches', поэтому функция chomp является ярлыком. Существует также черта для выполнения обрезки на месте с использованием мышления 'truncate'. Таким образом, преимущество в основном заключается в более коротком способе обрезки новых строк. – antoyo

Смежные вопросы