Rumah  >  Artikel  >  pembangunan bahagian belakang  >  fmt.Scanln Ralat Baris Baharu Tidak Dijangka: Apakah Perbezaan Antara fmt.Scan dan fmt.Scanln?

fmt.Scanln Ralat Baris Baharu Tidak Dijangka: Apakah Perbezaan Antara fmt.Scan dan fmt.Scanln?

Barbara Streisand
Barbara Streisandasal
2024-10-23 21:27:02487semak imbas

fmt.Scanln Unexpected Newline Error: What's the Distinction Between fmt.Scan and fmt.Scanln?

fmt.Scanln Ralat Baris Baharu Tidak Dijangka: Menyelidiki Pengendalian Input Go

Banyak pembangun Go menghadapi "ralat baris baharu yang dijangkakan fmt.Scanln" apabila berinteraksi dengan input pengguna. Untuk memahami ralat ini, adalah penting untuk menyelidiki cara kerja fmt.Scan dan fmt.Scanln.

fmt.Scan and Space-Separated Input
fmt.Scan reads space- input diasingkan daripada input standard. Setiap hujah yang diberikan kepada fmt.Scan sepadan dengan satu perkataan atau nilai yang dipisahkan oleh ruang. Kehadiran baris baharu dianggap sebagai ruang, membenarkan input berbilang baris. Ini ditunjukkan oleh kod berikut:

<code class="go">import "fmt"

func main() {
  var i int
  _, err := fmt.Scan(&i)
  if err == nil {
    fmt.Println("read 1 integer: ", i)
  }
}</code>

Disediakan dengan input "123", kod ini akan membaca dan mencetak "baca 1 integer: 123".

fmt.Scanln dan Newline-Delimited Input
Sebaliknya, fmt.Scanln menjangkakan aksara baris baharu sebagai pembatas. Selepas membaca semua input sehingga baris baharu, ia berhenti menghuraikan. Ini dinyatakan dengan jelas dalam dokumentasi Scanln:

"Scanln adalah serupa dengan Scan, tetapi berhenti mengimbas pada baris baharu dan selepas item terakhir mesti ada baris baharu atau EOF."

Tingkah laku ini menunjukkan dirinya dalam kod berikut:

<code class="go">import "fmt"

func main() {
  var s string
  _, err := fmt.Scanln(&s)
  if err == nil {
    fmt.Println("read 1 line: ", s)
  }
}</code>

Dengan input "semua orang suka ais krim", kod ini akan membaca dan mencetak "baca 1 baris: semua orang suka ais krim". Kehadiran "semua orang" dan "sayang" dipisahkan oleh ruang tidak mengganggu penghuraian kerana fmt.Scanln hanya dihadkan oleh baris baharu terakhir.

Memahami Ralat
Dalam contoh awal yang disediakan, Scanln menghadapi ralat "baris baharu dijangka" kerana rentetan input "semua orang suka ais krim" tidak berakhir dengan baris baharu. Untuk menyelesaikan masalah ini, aksara baris baharu mesti ada pada penghujung input.

Kaedah Alternatif untuk Membaca Baris
Jika matlamatnya adalah untuk membaca baris input, menggunakan ReadString daripada pakej bufio.Reader ialah alternatif yang boleh dipercayai kepada fmt.Scanln:

<code class="go">import (
  "bufio"
  "os"
)

func main() {
  reader := bufio.NewReader(os.Stdin)
  line, err := reader.ReadString('\n')
  if err == nil {
    fmt.Println("read 1 line: ", line)
  }
}</code>

Atas ialah kandungan terperinci fmt.Scanln Ralat Baris Baharu Tidak Dijangka: Apakah Perbezaan Antara fmt.Scan dan fmt.Scanln?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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