douguadao3883 2019-08-31 01:45
浏览 130
已采纳

为什么在有scanf的循环中,为什​​么会得到重复的输出?

When the user enters a wrong number, the code expects to show once the output message but this it's duplicated. why?

note: seems to be something with the scanf inside the loop because if I use scan lonely it works as expected.

Anyway, I can't understand why this behavior

package main

import (
  "fmt"
  "math/rand"
  "time"
)

func main(){
  rand.Seed(time.Now().UnixNano())

  var number int = rand.Intn(99)  
  var input int = 0

  fmt.Println("random: ", number)

  fmt.Println("enter a number: ")
  fmt.Scanf("%d",&input)

  for {
    if number != input {
      fmt.Println("wrong! try again:")
      fmt.Scanf("%d",&input)
      continue
    } else {
      fmt.Println("that's correct!")
      break
    }
  }
}
  • 写回答

2条回答 默认 最新

  • dongzhihong3940 2019-08-31 02:05
    关注

    To accomodate Windows, write fmt.Scanf("%d ", &input):

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func main() {
        rand.Seed(time.Now().UnixNano())
    
        var number int = rand.Intn(99)
        var input int = 0
    
        fmt.Println("random: ", number)
    
        fmt.Println("enter a number: ")
        fmt.Scanf("%d
    ", &input)
    
        for {
            if number != input {
                fmt.Println("wrong! try again:")
                fmt.Scanf("%d
    ", &input)
                continue
            } else {
                fmt.Println("that's correct!")
                break
            }
        }
    }
    

    Output:

    random:  84
    enter a number: 
    42
    wrong! try again:
    42
    wrong! try again:
    84
    that's correct!
    

    Windows uses " " for end-of-line. Linux and others use " " for end-of-line.

    You did not check for Scanf errors.

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func main() {
        rand.Seed(time.Now().UnixNano())
    
        var number int = rand.Intn(99)
        var input int = 0
    
        fmt.Println("random: ", number)
    
        fmt.Println("enter a number: ")
        n, err := fmt.Scanf("%d", &input)
        if err != nil {
            fmt.Println(n, err)
        }
    
        for {
            if number != input {
                fmt.Println("wrong! try again:")
                n, err := fmt.Scanf("%d", &input)
                if err != nil {
                    fmt.Println(n, err)
                }
                continue
            } else {
                fmt.Println("that's correct!")
                break
            }
        }
    }
    

    Output (Windows):

    random:  84
    enter a number:
    42
    wrong! try again:
    0 unexpected newline
    wrong! try again:
    42
    wrong! try again:
    0 unexpected newline
    wrong! try again:
    84
    that's correct!
    

    Windows Scans "42 " as "42" and " ".

    Output (Linux):

    random:  84
    enter a number: 
    42
    wrong! try again:
    42
    wrong! try again:
    84
    that's correct!
    

    Linux Scans "42 ".

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
  • ¥30 乘子法解约束最优化问题的matlab代码文件,最好有matlab代码文件
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用