Промывка стандартного буфера в Голанге? - PullRequest
0 голосов
/ 10 октября 2018

Я новое программирование с Go.Я писал эту маленькую программу, которая использует структуры.Это структура с именем user, которая имеет значения, имя, фамилию и возраст.Проблема заключается в том, что при вводе данных, а точнее, при вводе фамилии, возникает такая ошибка: снимок экрана с ошибкой

Из изображения видно, что при вводе данныхв поле имени игнорирует поле фамилии и переходит на возраст.

Имея знания в C, эта ошибка возникает, когда буфер не был очищен.(но C отличается от языка Go)

Как я знаю, Go stdin read не буферизован.Итак, как бы вы решили эту проблему?

Вот код:

package main

import "fmt"

type user struct {
    name, surnm string
    age int
}

func main() {

    n := new(user)

    fmt.Print("Name? ")
    fmt.Scanf("%s", &n.name)

    fmt.Print("Last name? ")
    fmt.Scanf("%s", &n.surnm)

    fmt.Print("Age? ")    
    fmt.Scanf("%d", &n.age)

    fmt.Println(n.name)         
    fmt.Println(n.surnm)
    fmt.Println(n.age)

}

Извините, если мой вопрос немного глуп, но, как я сказал, я новичок в Go.

1 Ответ

0 голосов
/ 10 октября 2018

Это немного сложно воспроизвести на ходу 1.11 в Ubuntu. Я предполагаю, что вы используете какую-то операционную систему Microsoft. Microsoft имеет окончание строк \ r \ n, return + newline, тогда как Unix-подобные системы имеют только \ nтолько перевод строки

Если я подделываю входной файл для вашей программы, у которого есть \ r \ n окончания строк, он, похоже, пропускает

В то время как входной файл только с \ n заставляет программу работать правильно

Добавление явного \ r к шаблону, как показано, кажется, решает проблему

fmt.Print("Name? ")
fmt.Scanf("%s\r", &n.name)

fmt.Print("Last name? ")
fmt.Scanf("%s\r", &n.surnm)

fmt.Print("Age? ")
fmt.Scanf("%d\r", &n.age)

Это любопытно, поскольку документация go для scanf состояний

Во всех функциях сканирования возврат каретки, за которым сразу следует новая строка, рассматривается как простая новая строка (\ r \ n означает то же, что \ n).

Чтобы быть справедливым,после внесения вышеуказанных изменений код ведет себя одинаково для файлов \ n и \ r \ n файлов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...