Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Fungsi Scanf Golang Gagal pada Windows Tetapi Berfungsi pada Mac?

Mengapa Fungsi Scanf Golang Gagal pada Windows Tetapi Berfungsi pada Mac?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 17:43:02881semak imbas

Why Does Golang's Scanf Function Fail on Windows But Work on Mac?

GOLang Scanf Ralat: Mengapa Ia Gagal pada Windows dan Bukan pada Mac

Mencari input pengguna ialah tugas biasa dalam pengaturcaraan. Dalam GOLang, fungsi Scanf sering digunakan untuk tujuan ini. Walau bagaimanapun, isu pelik timbul apabila menggunakan Scanf dua kali: ia berfungsi pada macOS tetapi tidak pada Windows.

Dalam coretan kod yang disediakan:

<code class="go">func credentials() (string, string) {

    var username string
    var password string

    fmt.Print("Enter Username: ")
    fmt.Scanf("%s", &username)

    fmt.Print("Enter Password: ")
    fmt.Scanf("%s", &password)

    return username, password
}</code>

Apabila dijalankan pada macOS, program menggesa pengguna untuk nama pengguna mereka dan kemudian kata laluan, seperti yang dijangkakan. Walau bagaimanapun, pada Windows, selepas menggesa nama pengguna, atur cara mengabaikan gesaan kata laluan dan keluar secara tiba-tiba.

Punca percanggahan ini terletak pada cara Scanf mentafsir input pengguna. Pada Windows, Scanf menggunakan carriage return (r) sebagai penamat talian lalai, manakala macOS menggunakan baris baharu (n). Apabila nama pengguna dimasukkan dan pengguna menekan Enter, Scanf menemui pemulangan pengangkutan dan mentafsirkannya sebagai penamat input. Akibatnya, program melangkau baris Scanf kedua dan keluar.

Untuk menyelesaikan isu ini pada Windows, kami boleh menggunakan Bufio, perpustakaan yang menyediakan penimbalan untuk operasi I/O. Bufio menawarkan alternatif kepada Scanf yang lebih teguh dan berfungsi secara konsisten merentas sistem pengendalian. Berikut ialah versi kod yang diubah suai menggunakan Bufio:

<code class="go">func credentials() (string, string) {
    reader := bufio.NewReader(os.Stdin)

    fmt.Print("Enter Username: ")
    username, _ := reader.ReadString('\n')

    fmt.Print("Enter Password: ")
    password, _ := reader.ReadString('\n')

    return strings.TrimSpace(username), strings.TrimSpace(password) // ReadString() leaves a trailing newline character
}</code>

Versi ini menggunakan ReadString untuk membaca input daripada pengguna. ReadString menerima pembatas, dalam kes ini aksara baris baharu 'n'. Ini memastikan bahawa kedua-dua nama pengguna dan kata laluan dibaca dengan betul walaupun pada Windows, kerana penamat talian dikendalikan dengan betul.

Ringkasnya, Scanf mempamerkan gelagat tidak konsisten pada sistem pengendalian yang berbeza, yang boleh dikaitkan dengan konvensyen penamatan talian yang berbeza. Dengan menggunakan Bufio, pembangun boleh mengatasi ketidakkonsistenan ini dan bergantung pada kaedah yang lebih dipercayai untuk menangkap input pengguna merentas pelbagai platform.

Atas ialah kandungan terperinci Mengapa Fungsi Scanf Golang Gagal pada Windows Tetapi Berfungsi pada Mac?. 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