Gostaria de ler a entrada padrão na linha de comando, mas minhas tentativas foram encerradas com a saída do programa antes de ser solicitada a entrada. Estou procurando o equivalente de Console.ReadLine () em c #.
Isto é o que eu tenho atualmente:
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
buffer de qualquer leitor (por exemplobufio.NewReader(os.Stdin)
) com leituras diretas do leitor subjacente (por exemplo,fmt.Scanln(x)
leia diretamente deos.Stdin
). O buffer pode ler arbitrariamente muito à frente. (Nesse caso específico, o último deve serfmt.Fscanln(reader,x)
a leitura do mesmo buffer).fmt.Sscanln
obras, torna-se "% v" após a execuçãoRespostas:
Não tenho certeza do que há de errado com o bloco
Como funciona na minha máquina. No entanto, para o próximo bloco, você precisa de um ponteiro para as variáveis às quais está atribuindo a entrada. Tente substituir
fmt.Scanln(text2)
porfmt.Scanln(&text2)
. Não useSscanln
, porque analisa uma string já na memória, em vez de no stdin. Se você quiser fazer algo parecido com o que estava tentando fazer, substitua-o porfmt.Scanf("%s", &ln)
Se isso ainda não funcionar, seu culpado pode ser algumas configurações estranhas do sistema ou um IDE com bugs.
fonte
ReadString('\n')
ouReadString("\n")
?rd
para a variávels
comoif s,_ = rd.ReadString('\n'); true { s = strings.Trim(s, " \n") }
cannot use "\n" (type string) as type byte in argument to reader.ReadString
você também pode tentar:
fonte
fmt.Println(scanner.Err())
abaixo do loop for.Eu acho que uma maneira mais padrão de fazer isso seria:
Dê uma olhada no
scan
godoc: http://godoc.org/fmt#Scanfonte
stops scanning at a newline and after the final item there must be a newline or EOF
então não tenho certeza porque o espaço "quebra" ... Eu acho que é um bugfmt.Scanln
efmt.Scan
com a versão atual 2016 go (versão go1.6.2 linux / amd64).Sempre tente usar o bufio.NewScanner para coletar entradas do console. Como já mencionado, existem várias maneiras de executar o trabalho, mas o Scanner foi originalmente projetado para executar o trabalho. Dave Cheney explica por que você deve usar o Scanner em vez do ReadLine do bufio.Reader.
https://twitter.com/davecheney/status/604837853344989184?lang=pt
Aqui está a resposta do trecho de código para sua pergunta
Se você não deseja coletar programaticamente as entradas, basta adicionar essas linhas
A saída do programa acima será:
O programa acima coleta as entradas do usuário e as salva em uma matriz. Também podemos interromper esse fluxo com um caractere especial. O scanner fornece API para uso avançado, como divisão usando uma função personalizada, etc., varredura de diferentes tipos de fluxos de E / S (Stdin, String) etc.
fonte
Outra maneira de ler várias entradas em um loop que pode manipular uma entrada com espaços:
Resultado:
fonte
Estou atrasado para a festa. Mas que tal um forro:
e pressione ctrl + d (EOT) quando a entrada for inserida na linha de comando.
fonte
os.Stdin
não 'termina', é impossível ler tudo. Você pode estar à espera de um tempo ...mail
.Experimente este código: -
fonte
Scanf()
não aceita espaços em branco na cordaTambém pode ser feito assim: -
fonte
Leia corretamente alguns valores solicitados:
Aqui está uma corrida:
fonte
Você precisa fornecer um ponteiro para a var que deseja digitalizar, da seguinte forma:
fonte
No meu caso, o programa não estava esperando porque eu estava usando o
watcher
comando para executar automaticamente o programa. A execução manual do programago run main.go
resultou em "Inserir texto" e, eventualmente, na impressão no console.fonte
Scan*
família é que eles leem até um separador de espaço em branco (por exemplo, espaço).