Mengapa fmt.Scanf() Menyebabkan Gelung Infinite dengan Input Tidak Sah dalam Go?

Patricia Arquette
Lepaskan: 2024-10-27 04:23:30
asal
365 orang telah melayarinya

Why Does fmt.Scanf() Cause an Infinite Loop with Invalid Input in Go?

Cara Mengendalikan Input Tidak Sah dalam fmt.Scanf Go

Bagi mereka yang menghadapi masalah dengan input tidak sah semasa menggunakan fmt.Scanf(), ia adalah penting untuk memahami sebab atur cara masuk ke dalam gelung tak terhingga apabila rentetan dimasukkan dan bukannya integer.

Dalam Go, fmt.Scanf() menghuraikan aliran input untuk penentu format tertentu (cth., "%d " untuk integer perpuluhan). Input tidak sah, seperti rentetan, menyebabkan ralat, tetapi input kekal dalam penimbal Stdin. Akibatnya, panggilan seterusnya ke fmt.Scanf() terus memproses input tidak sah yang sama, menghasilkan gelung tak terhingga.

Penyelesaian Menggunakan fmt.Scanln

Pendekatan alternatif ialah menggunakan fmt.Scanln(), yang berkelakuan berbeza. Ia membaca dan menggunakan keseluruhan baris input, termasuk sebarang aksara yang tidak sah. Ini boleh dilaksanakan seperti berikut:

<code class="go">fmt.Printf("Please enter an integer: ")

// Read in an integer
var i int
_, err := fmt.Scanln(&i)
if err != nil {
    fmt.Printf("Error: %s", err.Error())

    // If int read fails, read as string and forget
    var discard string
    fmt.Scanln(&discard)
    return
}
fmt.Printf("Input contained %d", i)</code>
Salin selepas log masuk

Pilihan Tambahan

Jika fmt.Scanln() tidak optimum, pilihan lain termasuk:

  • Menetapkan semula penimbal Stdin: Gunakan bufio.Reader.Reset() atau bufio.NewReader() untuk mengosongkan penimbal.
  • Pengesahan input tersuai: Cipta gelung yang berulang kali membaca dan mengesahkan input sehingga input yang sah diterima.
  • Gunakan pustaka input khusus: Pertimbangkan untuk menggunakan perpustakaan seperti bufio.Reader, yang memberikan lebih kawalan ke atas pengendalian input.

Atas ialah kandungan terperinci Mengapa fmt.Scanf() Menyebabkan Gelung Infinite dengan Input Tidak Sah dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!