Saya ingin membaca input standar dari baris perintah, tetapi upaya saya telah berakhir dengan program yang keluar sebelum saya diminta untuk input. Saya mencari yang setara dengan Console.ReadLine () di C #.
Inilah yang saat ini saya miliki:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
fmt.Println("Enter text: ")
text2 := ""
fmt.Scanln(text2)
fmt.Println(text2)
ln := ""
fmt.Sscanln("%v", ln)
fmt.Println(ln)
}
bufio
buffering dari pembaca mana pun (mis.bufio.NewReader(os.Stdin)
) Dengan membaca langsung dari pembaca garis bawah (mis.fmt.Scanln(x)
Langsung membaca darios.Stdin
). Buffering dapat membaca secara sewenang-wenang jauh di depan. (Dalam kasus khusus ini nanti harusfmt.Fscanln(reader,x)
membaca dari buffer yang sama).fmt.Sscanln
karya, itu menjadi "% v" setelah berjalanJawaban:
Saya tidak yakin apa yang salah dengan blok itu
Saat ini bekerja pada mesin saya. Namun, untuk blok berikutnya Anda memerlukan pointer ke variabel yang Anda tetapkan inputnya. Coba ganti
fmt.Scanln(text2)
denganfmt.Scanln(&text2)
. Jangan gunakanSscanln
, karena mem-parsing sebuah string yang sudah ada dalam memori, bukan dari stdin. Jika Anda ingin melakukan sesuatu seperti apa yang Anda coba lakukan, gantikan denganfmt.Scanf("%s", &ln)
Jika ini masih tidak berhasil, pelakunya mungkin beberapa pengaturan sistem aneh atau IDE kereta.
sumber
ReadString('\n')
atauReadString("\n")
?rd
ke variabels
sebagaiif s,_ = rd.ReadString('\n'); true { s = strings.Trim(s, " \n") }
cannot use "\n" (type string) as type byte in argument to reader.ReadString
Anda juga dapat mencoba:
sumber
fmt.Println(scanner.Err())
bawah for loop.Saya pikir cara yang lebih standar untuk melakukan ini adalah:
Lihatlah
scan
godoc: http://godoc.org/fmt#Scansumber
stops scanning at a newline and after the final item there must be a newline or EOF
tidak yakin mengapa ruang "memecahnya" ... saya kira itu adalah bugfmt.Scanln
danfmt.Scan
dengan versi go 2016 saat ini (go version go1.6.2 linux / amd64).Selalu mencoba menggunakan bufio.NewScanner untuk mengumpulkan input dari konsol. Seperti yang disebutkan lainnya, ada beberapa cara untuk melakukan pekerjaan itu tetapi Pemindai pada awalnya dimaksudkan untuk melakukan pekerjaan itu. Dave Cheney menjelaskan mengapa Anda harus menggunakan Scanner alih-alih bufio.Reader's ReadLine.
https://twitter.com/davecheney/status/604837853344989184?lang=en
Ini jawaban potongan kode untuk pertanyaan Anda
Jika Anda tidak ingin mengumpulkan input secara terprogram, cukup tambahkan baris ini
Output dari program di atas adalah:
Program di atas mengumpulkan input pengguna dan menyimpannya ke sebuah array. Kita juga dapat memutus aliran itu dengan karakter khusus. Pemindai menyediakan API untuk penggunaan tingkat lanjut seperti pemisahan menggunakan fungsi kustom, dll., Memindai berbagai jenis aliran I / O (Stdin, String) dll.
sumber
Cara lain untuk membaca banyak input dalam satu loop yang dapat menangani input dengan spasi:
Keluaran:
sumber
Saya terlambat ke pesta. Tapi bagaimana dengan satu liner:
dan tekan ctrl + d (EOT) setelah input dimasukkan pada baris perintah.
sumber
os.Stdin
tidak 'berakhir' tidak mungkin untuk membaca semuanya. Anda mungkin menunggu beberapa saat ...mail
.Coba kode ini: -
sumber
Scanf()
tidak menerima spasi putih dalam stringBisa juga dilakukan seperti ini: -
sumber
Dibaca dengan bersih dalam pasangan, nilai yang diminta:
Inilah yang dijalankan:
sumber
Anda perlu memberikan pointer ke var yang ingin Anda pindai, seperti:
sumber
Dalam kasus saya, program tidak menunggu karena saya menggunakan
watcher
perintah untuk menjalankan program secara otomatis. Menjalankan program secara manualgo run main.go
menghasilkan "Masukkan teks" dan akhirnya mencetak ke konsol.sumber
Scan*
keluarga adalah bahwa mereka membaca hingga pemisah spasi (misalnya spasi).