Sto lavorando attraverso il libro Go di Caleb Doxsey e ho due domande su fmt.Scanf
http://www.golang-book.com/4Perché fmt.Scanf in Go non aspetta l'input dell'utente?
Mi chiedo il motivo per cui il programma non si ferma dopo il secondo Scanf e attendere l'input dell'utente? E come posso verificare se l'utente ha inserito un numero intero e/o non ha lasciato nulla?
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))
}
Funziona correttamente per me. Ho intenzione di indovinare che si tratta di un problema di fine linea. Se stai lavorando su Windows, i finali di linea sono convenzionalmente indicati con '\ r \ n', mentre su Mac OS X e Linux (dove ho provato questo), è solo '\ n'. La mia ipotesi è che forse Go sta leggendo il '\ r', trattandolo come una linea che termina e lasciando il \ n 'sul flusso. Quindi quando richiama fmt.Scanf di nuovo, c'è già qualcosa nel buffer e non c'è bisogno di bloccarlo. Questa è solo un'ipotesi. – deong
ok. Qualche suggerimento su come risolverlo? Questo è ciò che ottengo in esecuzione nella riga di comando di Windows: c: \ Go \ src \ play \ exercise> go run loop_exercise.go Inserire un numero per ottenere la radice quadrata: 2 Immettere la prima ipotesi y -> + Inf – Zeynel
Cosa succede se si legge esplicitamente un carattere di nuova riga con la chiamata Scanf? Come "' fmt.Scanf ("% f \ n", & inputGuess) '"? In alternativa, puoi svuotare lo stdin dopo ogni lettura. Non so andare abbastanza bene da sapere dove dirti di cercare una funzione Flush. – deong