На самом деле рассматриваемый код работает на Unix-системах, но обычно проблема заключается в том, что вызовы типа fmt.Scanf("%f", &x1)
не потребляют переводы строки, а заключают в кавычки из пакета документов fmt: Scanning
:
Scan, Fscan, Sscan обрабатывают символы новой строки во вводе как пробелы.
И в Windows символ новой строки представляет собой не один \n
символ, а \r\n
, поэтому последующий fmt.Scanf()
Вызов будет продолжен немедленно, не ожидая дальнейшего ввода от пользователя.
Таким образом, вы должны добавить новую строку в строку формата, чтобы избежать последующего вызова fmt.Scanf()
для продолжения:
fmt.Scanf("%f\n", &x1)
Нопроще было бы просто использовать fmt.Scanln()
и пропустить всю строку формата:
fmt.Scanln(&x1)
Scanln, Fscanln и Sscanln прекращают сканирование на новой строке и требуют, чтобы элементы былис последующим переводом строки или EOF.
Функции сканера (fmt.ScanXXX()
) возвращают количество успешно отсканированных элементов и error
.Чтобы определить, успешно ли выполнено сканирование, необходимо проверить его возвращаемое значение, например:
if _, err := fmt.Scanln(&x1); err != nil {
fmt.Println("Scanning failed:", err)
}