2017-04-21 17 views
3

コマンドラインから2つの入力:ユーザー名とパスワードを読み取るプログラムがあります。文字列 "Password:"はユーザー名を入力した後でのみコンソールに表示されますが、私のプログラムでは最初の文字列 "Username:"と共にすぐに印刷されます。これを修正するには?連続した出力と文字列の入力Go

package main 

import (
    "bufio" 
    "os" 
    "fmt" 
) 
// A simple program that verifies the user by username and password. 

var loginstatus bool 
var username, password string 
func login(username, password string) bool { 
    if username == "user123" && password == "pass123" { 
     return true 
    } else { 
     return false 
    } 
} 

func main() { 
    fmt.Print("Username: ") 
    user := bufio.NewScanner(os.Stdin) 
    fmt.Print("Password: ") 
    pass := bufio.NewScanner(os.Stdin) 


    for user.Scan() && pass.Scan() { 
     if login(user.Text(), pass.Text()) { 
      fmt.Println("Signed in.") 
      os.Exit(3) 
     } else { 
      fmt.Println("Incorrect username or password, please try again:") 
     } 
    } 
} 

答えて

5

ラインbufio.NewScanner(os.Stdin)だけで、実際にスキャンを行っていない、それを標準入力のための新しいスキャナを作成し、ユーザーの入力を待ってブロックしません。 Scanに「Username:」と「Password:」がすでに印刷されているまで、実際にはstdinから読み取ることはできません。

ユーザ名とパスワードに2つのスキャナは必要ありません。一つのスキャナは十分なはずです、あなたはおそらくの印刷移動したい

func main() { 
    scanner := bufio.NewScanner(os.Stdin) 

    for { 
     fmt.Print("Username: ") 
     if !scanner.Scan() { 
      break 
     } 
     user := scanner.Text() 
     fmt.Print("Password: ") 
     if !scanner.Scan() { 
      break 
     } 
     pass := scanner.Text() 
     if login(user, pass) { 
      fmt.Println("Signed in.") 
      os.Exit(3) 
     } else { 
      fmt.Println("Incorrect username or password, please try again:") 
     } 
    } 
} 
0

:あなたは、それは次のようになりますので、再度お試しすることができるようにしたい場合はforループの中に、「ユーザ名:」と「パスワード」を

func main() { 
    scanner := bufio.NewReader(os.Stdin) 

    fmt.Print("Username: ") 
    user, _ := scanner.ReadString('\n') 
    fmt.Print("Password: ") 
    pass, _ := scanner.ReadString('\n') 

    if login(user, pass) { 
     fmt.Println("Signed in.") 
     os.Exit(3) 
    } else { 
     fmt.Println("Incorrect username or password, please try again:") 
    } 
} 
+1

あなたはあなただけの作成bufio.NewScannerから文字列を(読む必要が言う:あなたは最初bufio.NewScannerから新しいスキャナを宣言してからos.Stdinからデータを読み取るためのメソッドReadStringを使用する必要がありますスキャナでは、文字列を読み込まないので、少し誤解を招く)、あなたの例ではスキャナをまったく使用しません。この回答は、新しいGoユーザにとって混乱を招く可能性があります。 – Adrian

+0

@Adrian、私は説明とコードを更新しました。 –

関連する問題