Сайт работает в тестовом режиме - все замечания, предложения и информацию о найденных ошибках направляйте, пожалуйста, в Telegram-группу
Курс в процессе наполнения. Полный курс доступен на Степике

Баг: Несоответствие типов с оставшимися данными в буфере

// ❌ Классический сценарий: число, потом строка
var num int
var text string

fmt.Scan(&num)   // пользователь ввел: "42 hello"
// num = 42, а "hello" осталось в буфере!

fmt.Scan(&text)  // читает "hello" из буфера ДО того, как пользователь что-то ввел
// программа не ждет ввода, а берет остатки

// Пользователь в шоке: его не спросили второй раз 

Решение - очистка буфера после scanf:

// ✅ Вариант 1: сбросить остатки
var num int
var text string

fmt.Scan(&num)  // если ввели "42 hello"

// Съедаем всё, что осталось до конца строки
fmt.Scanln()    

fmt.Scan(&text) // теперь нормально спросит пользователя

// ✅ Вариант 2: читать через bufio.Reader оба раза
reader := bufio.NewReader(os.Stdin)
fmt.Fscan(reader, &num)
fmt.Fscan(reader, &text) // каждый раз новые данные

Программа не падает, не выдает ошибок, но ведет себя странно - пропускает ввод. На маленьких тестах работает, в боевом коде - сюрпризы. Пользователи думают, что программа зависла или сломалась, а она просто молча читает мусор из буфера. Бывает незаметно, если тестировать идеальными данными без пробелов.

Загрузка...