# Ввод данных от пользователя в Rust: как использовать stdin

> Узнай, как считывать пользовательский ввод в Rust с помощью std::io::stdin().read_line. Простые примеры, обработка ошибок, удаление символа новой строки, тип Result<usize> и рекомендации по CLI

- **URL:** https://eagle2000.space/rust/rust-stdio/
- **Date:** 2025-06-08

- **Tags:** rust, dev

---## Введение




В этой статье разберём как получать ввод от пользователя в терминальном приложении на Rust с использованием стандартной библиотеки. 

Казалось бы, простая задача - спросить имя и поприветствовать пользователя. Но даже в этом примере кроются важные особенности языка: работа со стандартным вводом, ссылки, обработка ошибок и типы.

## Что потребуется?

Нам понадобится модуль `std::io` который входит в стандартную библиотеку Rust. Он предоставляет доступ к `stdin()` — стандартному вводу. Чтобы использовать его, нужно подключить:

```rust
use std::io;
```

## Пример: Приветствие пользователя

Начнём с минимального приложения:

```rust
use std::io;

fn main() {
    let mut input {{< golink id="a1" />}} = String::new(); {{< golink id="a2" />}}

    println!("Enter your name:");
    io::stdin().read_line(&mut input).unwrap(); {{< golink id="a3" />}}

    println!("Hello {input}");
}
```



### Что здесь важно:

* `&mut input` {{< codelink id="a1" />}} - передаём изменяемую ссылку, потому что `read_line` требует возможность изменить содержимое.
* `String::new()` {{< codelink id="a2" />}} - создаёт пустую строку для хранения ввода.
* `.unwrap()` - в данном случае упрощённая обработка `Result`. Позже заменим это на более надёжный способ. {{< codelink id="a3" />}}

## Коротко о типах

Функция `read_line` возвращает `Result<usize>` где `usize` — количество байт прочитанных из ввода. 


{{< alert "fire" >}}
Тип `usize` — это целое без знака, размер которого зависит от архитектуры машины (например, 64-битный на x86\_64).
{{< /alert >}}

## Добавим отладочную информацию:

```rust
use std::io;

fn main() {
    let mut input = String::new();

    println!("Enter your name:");

    match io::stdin().read_line(&mut input) {
        Ok(n) => {
            println!("{n} bytes read");
            println!("Hello {input}");
        }
        Err(error) => println!("error: {error}"),
    }
}
```

### Пример вывода:

```
Enter your name:
developer
10 bytes read
Hello developer
```

{{< alert "fire" >}}
Почему 10 байт? Строка `"developer"` — это 9 символов + 1 символ новой строки `\n` автоматически добавляемый после нажатия Enter.
{{< /alert >}}



## Практическое применение

Такой ввод часто используется в CLI-интерфейсах: для подтверждения действия, выбора режима работы, простых форм.

Особенности ввода в CLI:

* `read_line` блокирует выполнение, пока пользователь не введёт строку.
* Строка сохраняет символ новой строки `\n`, что иногда требуется удалять с помощью `.trim()`.

> Совет: чтобы избавиться от `\n`, используйте `.trim()`
>
> ```rust
> let name = input.trim();
> println!("Hello {name}");
> ```

## Заключение

Мы познакомились с базовым способом взаимодействия с пользователем в консольном приложении на Rust. Хотя код получился коротким. Под капотом - работа с изменяемыми ссылками, возвратом `Result`, безопасной обработкой ввода и особенностями строк.


На этом всё. Пробуйте, меняйте, экспериментируйте.

{{< typeit
      speed=50
>}}
Продолжение следует...
{{< /typeit >}}

