Неожиданное значение при чтении пользовательского ввода из стандартного ввода

rust

1637 просмотра

3 ответа

80 Репутация автора

Я пытаюсь получить пользовательский ввод и проверить, если пользователь введет "у" или "п". Удивительно, но в приведенном ниже коде ни то, ifни другое не if elseвыполняется! По-видимому, correct_nameэто не «у» и не «н». Как это может быть? Я неправильно выполняю преобразование строк?

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!");
    } else if correct_name == "n" {
        println!("matched n!");
    }
}
Автор: Joe Источник Размещён: 05.01.2015 04:12

Ответы (3)


8 плюса

11346 Репутация автора

Решение

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

Автор: wingedsubmariner Размещён: 05.01.2015 04:45

12 плюса

187010 Репутация автора

Вместо этого 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!");
    } else if correct_name.trim() == "n" {
        println!("matched n!");
    }
}

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

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

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

Поэтому Windows / Linux / macOS не должны иметь значения.


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

let trimmed_len = correct_name.trim_right().len();
correct_name.truncate(trimmed_len);
Автор: Shepmaster Размещён: 15.09.2016 08:51

2 плюса

6289 Репутация автора

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

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

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

Автор: antoyo Размещён: 15.11.2016 05:44
Вопросы из категории :
32x32