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

Пользователь

от didikizi , в категории: Общие вопросы , год назад

Коллеги, добрый день!

Заранее извиняюсь, я тут совсем новенький.

Для обучения писал калькулятор, но когда начал обрабатывать ошибку ввода не корректных данных наткнулся на то, что все действия после взятия error связанные с ним отрабатывают несколько раз (равное количеству ошибок) (буквально фантомный цикл), не смог найти информацию почему так происходит и как это отключить. Подскажите, пожалуйста.

Код прилагаю:

(Выделил жирным моменты взятия error)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package main

import (
    "fmt"
    //"errors"
    //"math"
)

func main() {
    var x, y int64
    var operant string
    flag := true
    for {
        fmt.Println("Введите X:")
        for {
            _, err := fmt.Scan(&x)
            if err != nil {
                fmt.Println("Введено не корректное значение")
            } else {
                err = nil
                break
            }
        }
        fmt.Println("Введите Y:")
        for {
            _, err := fmt.Scan(&y)
            if err != nil {
                fmt.Println("Введено не корректное значение")
            } else {
                break
            }
        }
        fmt.Println("Введите действие:")
        fmt.Scan(&operant)
        for flag {
            switch operant {
            case "+":
                answer := x + y
                fmt.Println("Ответ :", answer)
                flag = false
            case "-":
                answer := x - y
                fmt.Println("Ответ :", answer)
                flag = false
            case "*":
                answer := float32(x) * float32(y)
                fmt.Println("Ответ :", answer)
                flag = false
            case "/":
                answer := float32(x) / float32(y)
                fmt.Println("Ответ :", answer)
                flag = false
            default:
                fmt.Println("Введена некорректная операция, введите заново")
                fmt.Scan(&operant)
            }
        }
    }
}


Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

2 ответа

Пользователь

от didikizi , год назад

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

Опять же непонятные события стороннего наблюдателя

Пользователь

от jaclyn , год назад

@didikizi Вам нужно использовать отдельные переменные err для каждого вложенного цикла. Вот исправленный код:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package main

import (
    "fmt"
)

func main() {
    var x, y int64
    var operant string
    flag := true
    for {
        fmt.Println("Введите X:")
        for {
            _, errX := fmt.Scan(&x)
            if errX != nil {
                fmt.Println("Введено не корректное значение")
            } else {
                break
            }
        }
        fmt.Println("Введите Y:")
        for {
            _, errY := fmt.Scan(&y)
            if errY != nil {
                fmt.Println("Введено не корректное значение")
            } else {
                break
            }
        }
        fmt.Println("Введите действие:")
        fmt.Scan(&operant)
        for flag {
            switch operant {
            case "+":
                answer := x + y
                fmt.Println("Ответ :", answer)
                flag = false
            case "-":
                answer := x - y
                fmt.Println("Ответ :", answer)
                flag = false
            case "*":
                answer := float32(x) * float32(y)
                fmt.Println("Ответ :", answer)
                flag = false
            case "/":
                answer := float32(x) / float32(y)
                fmt.Println("Ответ :", answer)
                flag = false
            default:
                fmt.Println("Введена некорректная операция, введите заново")
                fmt.Scan(&operant)
            }
        }
    }
}