Я хотел бы прочитать стандартный ввод из командной строки, но мои попытки закончились выходом из программы, прежде чем меня попросят ввести. Я ищу эквивалент Console.ReadLine () в C #.
Вот что у меня сейчас есть:
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
буферизацию любого считывателя (напримерbufio.NewReader(os.Stdin)
) с прямым чтением из подчеркивающего считывателя (например,fmt.Scanln(x)
непосредственно из чтенияos.Stdin
). Буферизация может читать произвольно далеко вперед. (В этом конкретном случае последнее должно бытьfmt.Fscanln(reader,x)
прочитано из того же буфера).fmt.Sscanln
работы, он становится "% v" после запускаОтветы:
Я не уверен, что не так с блоком
Как это работает на моей машине. Однако для следующего блока вам нужен указатель на переменные, которым вы назначаете вход. Попробуйте заменить
fmt.Scanln(text2)
наfmt.Scanln(&text2)
. Не используйтеSscanln
, потому что он анализирует строку уже в памяти, а не из стандартного ввода. Если вы хотите сделать что-то вроде того, что вы пытались сделать, замените это наfmt.Scanf("%s", &ln)
Если это все еще не работает, ваш виновник может быть странными настройками системы или глючной IDE.
источник
ReadString('\n')
илиReadString("\n")
?rd
в переменную,s
какif s,_ = rd.ReadString('\n'); true { s = strings.Trim(s, " \n") }
cannot use "\n" (type string) as type byte in argument to reader.ReadString
Вы также можете попробовать:
источник
fmt.Println(scanner.Err())
ниже для цикла.Я думаю, что более стандартный способ сделать это будет:
Посмотрите на
scan
Годока: http://godoc.org/fmt#Scanисточник
stops scanning at a newline and after the final item there must be a newline or EOF
так не уверен, почему космос "ломает" его ... Я думаю, это ошибкаfmt.Scanln
иfmt.Scan
с текущей версией 2016 года go (версия go go 1.6.6 linux / amd64).Всегда старайтесь использовать bufio.NewScanner для сбора данных с консоли. Как уже упоминалось, есть несколько способов сделать эту работу, но изначально Сканер предназначен для этой работы. Дейв Чейни объясняет, почему вы должны использовать Scanner вместо ReadLine bufio.Reader.
https://twitter.com/davecheney/status/604837853344989184?lang=en
Вот фрагмент кода ответа на ваш вопрос
Если вы не хотите программно собирать данные, просто добавьте эти строки
Вывод вышеуказанной программы будет:
Выше программа собирает пользовательский ввод и сохраняет его в массив. Мы также можем разорвать этот поток с помощью специального символа. Сканер предоставляет API для расширенного использования, такого как разделение с использованием пользовательских функций и т. Д., Сканирование различных типов потоков ввода-вывода (Stdin, String) и т. Д.
источник
Другой способ прочитать несколько входов в цикле, который может обрабатывать ввод с пробелами:
Вывод:
источник
Я опоздал на вечеринку. Но как насчет одного лайнера:
и нажмите Ctrl + D (EOT), как только ввод введен в командной строке.
источник
os.Stdin
что не заканчивается, невозможно все это прочитать. Вы могли бы подождать некоторое время ...mail
.Попробуйте этот код: -
источник
Scanf()
, не принимает пробелы в строкеТакже можно сделать так:
источник
Прочитайте в пару подсказок:
Вот бег:
источник
Вам нужно указать указатель на переменную, которую вы хотите сканировать, например:
источник
В моем случае программа не ждала, потому что я использовал
watcher
команду для автоматического запуска программы. Запуск программы вручнуюgo run main.go
привел к «Вводу текста» и, в конечном итоге, к печати на консоли.источник
Scan*
семейства состоит в том, что они читают до разделителя пробела (например, пробела).