英文:
Sequential output and input of strings in Go
问题
有一个程序从命令行读取两个输入:用户名和密码。字符串"Password: "应该在输入用户名后才在控制台打印出来,但在我的程序中,它与第一个字符串"Username: "一起立即打印出来。如何修复这个问题?
package main
import (
"bufio"
"os"
"fmt"
)
// 一个简单的程序,通过用户名和密码验证用户。
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:")
}
}
}
这个问题可以通过将fmt.Print("Password: ")
移动到for
循环内部解决。这样,当输入用户名后,才会打印出"Password: "。修复后的代码如下:
package main
import (
"bufio"
"os"
"fmt"
)
// 一个简单的程序,通过用户名和密码验证用户。
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)
for user.Scan() {
fmt.Print("Password: ")
pass := bufio.NewScanner(os.Stdin)
if login(user.Text(), pass.Text()) {
fmt.Println("Signed in.")
os.Exit(3)
} else {
fmt.Println("Incorrect username or password, please try again:")
}
}
}
修复后的代码会在输入用户名后才打印出"Password: "。
英文:
There is a program that reads two inputs from command line: username and password. The string "Password: " should be printed in console only after entering the username, but in my program it prints right away along with the first string "Username: ". How to fix this?
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:")
}
}
}
答案1
得分: 5
bufio.NewScanner(os.Stdin)
这一行只是创建了一个用于标准输入的新扫描器,它并不实际进行扫描,并且不会阻塞等待用户输入。直到调用Scan
方法之前,它不会从标准输入中读取任何内容,此时"Username:"和"Password:"已经被打印出来。
你可能不需要两个扫描器来分别处理用户名和密码。一个扫描器应该足够了,如果你想要能够重试,你可能需要将打印"Username:"和"Password:"的部分移到for循环中,代码可能如下所示:
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:")
}
}
}
英文:
The line bufio.NewScanner(os.Stdin)
just creates a new scanner for stdin it does not actually do the scanning and will not block waiting for user input. It will not actually read from stdin until you call Scan
by which point "Username:" and "Password:" have already been printed.
You probably don't need two scanners for username and password. One scanner should be enough and you probably want to move the printing of "Username:" and "Password:" into the for loop if you want to be able to try again so it would look something like:
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:")
}
}
}
答案2
得分: 0
你需要首先声明一个新的Scanner,使用bufio.NewScanner方法,然后使用ReadString方法从os.Stdin读取数据:
func main() {
scanner := bufio.NewReader(os.Stdin)
fmt.Print("用户名:")
user, _ := scanner.ReadString('\n')
fmt.Print("密码:")
pass, _ := scanner.ReadString('\n')
if login(user, pass) {
fmt.Println("登录成功。")
os.Exit(3)
} else {
fmt.Println("用户名或密码错误,请重试:")
}
}
请注意,这只是代码的翻译部分,不包括其他内容。
英文:
You need to declare first a new Scanner from bufio.NewScanner and then use the method ReadString to read the data from os.Stdin :
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:")
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论