Tôi đang làm việc thông qua Go cuốn sách Caleb Doxsey và tôi có hai câu hỏi về fmt.Scanf
http://www.golang-book.com/4Tại sao fmt.Scanf ở chế độ chờ đợi cho đầu vào của người dùng?
Tôi tự hỏi tại sao chương trình không chỉ dừng lại sau khi scanf thứ hai và chờ đợi cho người dùng nhập vào? Và làm thế nào để kiểm tra nếu người dùng đã nhập một số nguyên và/hoặc không để trống?
package main
import (
"fmt"
//"math"
)
// compute square roots by using Newton's method
func main() {
var x float64 //number to take square root
var y float64 //this is the guess
var q float64 //this is the quotient
var a float64 //this is the average
// how do check if the user entered a number
fmt.Print("Enter a number to take its square root: ")
var inputSquare float64
fmt.Scanf("%f", &inputSquare)
// why doesn't program stop after
// the Print statement and wait
// for user input?
fmt.Print("Enter first guess ")
var inputGuess float64
fmt.Scanf("%f", &inputGuess)
//x = 2
x = inputSquare
y = inputGuess
for i := 0; i < 10; i++ { //set up the for loop for iterations
q = x/y //compute the quotient; x and y are given
a = (q + y)/x //compute the average
y = a //set the guess to the average
} //for the next loop
fmt.Println("y --> ", y)
//fmt.Println("Sqrt(2)", math.Sqrt(2))
}
Nó hoạt động đúng cho tôi. Tôi sẽ đoán rằng đó là một dòng kết thúc vấn đề. Nếu bạn đang chạy trên Windows, dòng kết thúc được ký hiệu thông thường bởi '\ r \ n', trong khi trên Mac OS X và Linux (nơi tôi đã thử nghiệm này), nó chỉ là '\ n'. Tôi đoán là có thể Go đang đọc '\ r', coi nó là một dòng kết thúc, và để '\ n' trên luồng. Vì vậy, khi bạn gọi fmt.Scanf một lần nữa, đã có một cái gì đó trong bộ đệm và không cần phải chặn. Đây chỉ là một đoán hoang dã mặc dù. – deong
ok. Bất kỳ đề xuất làm thế nào để sửa chữa nó? Đây là những gì tôi chạy trong dòng lệnh của Windows: c: \ Go \ src \ play \ exercise> chạy vòng lặp_exercise.go Nhập số cần căn bậc hai: 2 Nhập lần đầu tiên đoán y -> + Inf – Zeynel
Cái gì gì xảy ra nếu bạn đọc một ký tự dòng mới bằng lệnh Scanf một cách rõ ràng? Giống như "' fmt.Scanf ("% f \ n", & inputGuess) '"? Cách khác, bạn có thể xả stdin sau mỗi lần đọc. Tôi không biết cũng đủ để biết nơi để nói với bạn để tìm một chức năng Flush. – deong