0Pricing
Go Academy · Урок

Сканирование ввода

Читайте форматированный ввод

«Сканирование ввода» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Чтение входных данных с помощью fmt

Пакет fmt умеет не только выводить значения, но и читать их. Функции сканирования разбирают текст и записывают его в переменные соответствующих типов.

Они являются зеркальным отражением функций вывода.

package main

import "fmt"

func main() {
    var n int
    fmt.Sscan("42", &n)
    fmt.Println(n + 1)
}

Требуются указатели

Функции сканирования должны сохранить результат, поэтому передавайте адрес каждой переменной с помощью &.

Забыть & — самая распространённая ошибка при сканировании.

package main

import "fmt"

func main() {
    var a, b int
    fmt.Sscan("3 4", &a, &b)
    fmt.Println(a + b)
}

Sscan разделяет данные по пробелам

fmt.Sscan считывает разделённые пробелами значения из строки в несколько переменных, определяя тип по каждому указателю.

package main

import "fmt"

func main() {
    var name string
    var age int
    fmt.Sscan("Ada 36", &name, &age)
    fmt.Println(name, age)
}

Sscanf использует формат

fmt.Sscanf разбирает данные согласно строке формата, подобно тому как Printf делает это в обратную сторону. Литералы в формате должны совпадать с входными данными.

package main

import "fmt"

func main() {
    var h, m int
    fmt.Sscanf("09:05", "%d:%d", &h, &m)
    fmt.Println(h, m)
}

Проверка количества считанных значений

Функции сканирования возвращают количество успешно разобранных элементов и ошибку. Проверьте это количество, чтобы узнать, полностью ли выполнен разбор.

package main

import "fmt"

func main() {
    var a, b int
    count, _ := fmt.Sscan("7", &a, &b)
    fmt.Println("parsed:", count)
}

Обработка ошибок разбора

Если входные данные не соответствуют ожидаемому типу, возвращается ошибка. При работе с реальными входными данными всегда проверяйте её.

package main

import "fmt"

func main() {
    var n int
    _, err := fmt.Sscan("notanumber", &n)
    if err != nil {
        fmt.Println("error:", err)
    }
}

Разбор смешанных типов

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

package main

import "fmt"

func main() {
    var word string
    var price float64
    var ok bool
    fmt.Sscan("apple 1.50 true", &word, &price, &ok)
    fmt.Println(word, price, ok)
}

Sscanf с буквальным текстом

Sscanf отлично подходит для фиксированных форматов, например координат или пар «ключ—значение», где знаки пунктуации разделяют числа.

package main

import "fmt"

func main() {
    var x, y int
    fmt.Sscanf("(3,8)", "(%d,%d)", &x, &y)
    fmt.Println(x, y)
}

Чтение чисел с плавающей точкой

Используйте %f в Sscanf или *float64 в Sscan, чтобы считывать десятичные числа.

package main

import "fmt"

func main() {
    var temp float64
    fmt.Sscanf("21.5C", "%fC", &temp)
    fmt.Println(temp)
}

Сканирование и стандартный ввод

fmt.Scan и fmt.Scanf считывают данные из стандартного ввода так же, как Sscan считывает их из строки. Правила разбора одинаковы, различается только источник.

package main

import "fmt"

func main() {
    line := "100 200"
    var a, b int
    fmt.Sscan(line, &a, &b)
    fmt.Println(a * b)
}

Небольшой разборщик

Объедините сканирование с вычислением, чтобы разобрать запись и получить результат.

package main

import "fmt"

func main() {
    var name string
    var qty int
    var unit float64
    fmt.Sscanf("pen 3 1.25", "%s %d %f", &name, &qty, &unit)
    fmt.Printf("%s total: $%.2f\n", name, float64(qty)*unit)
}

Быстрая проверка

Что нужно передать функции сканирования, чтобы сохранить результат?

Итоги: сканирование входных данных

Вы научились читать форматированные входные данные:

  • Sscan разделяет данные по пробельным символам; Sscanf следует строке формата.
  • Передавайте указатели с помощью & для каждой целевой переменной.
  • Проверяйте возвращённые количество и ошибку, чтобы обнаруживать некорректные входные данные.
package main

import "fmt"

func main() {
    var d, mo, y int
    fmt.Sscanf("30/05/2026", "%d/%d/%d", &d, &mo, &y)
    fmt.Println(y, mo, d)
}

Часто задаваемые вопросы

Урок «Сканирование ввода» бесплатный?

Да — полный текст урока «Сканирование ввода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сканирование ввода»?

Читайте форматированный ввод Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Сканирование ввода»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Глаголы Printf
  2. Sprintf и Fprintf
  3. Интерфейс Stringer
  4. Сканирование ввода
← Назад к Go Academy