Comment lire l'entrée de la console de ligne?
Je voudrais lire l'entrée de la ligne de commande, mais mes tentatives ont terminé avec le programme de la sortie avant que je suis invité pour la saisie. Je suis à la recherche de l'équivalent de Console.ReadLine() en C#.
C'est ce que j'ai actuellement:
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)
}
- Ce code semble correct. Par curiosité, vous êtes l'exécution de ce sur le terrain de jeu? La Aller de l'Aire de jeu ne permet pas d'entrée stdin en raison de la mise en réseau des raisons.
- Je suis en cours d'exécution au niveau local.
- Passons sur le fait, il semble être une subtile question où vous avez besoin d'un pointeur (voir ma réponse). Si je ne suis pas sûr de ce que le problème avec la bufio.NewReader méthode est depuis cela fonctionne pour moi.
- double possible de Lire initiale stdin en ALLER?
- Ne pas mélanger
bufio
de mise en mémoire tampon de tout lecteur (par exemple,bufio.NewReader(os.Stdin)
) à diriger les lectures de l'soulignant lecteur (par exemple,fmt.Scanln(x)
lit directement à partir deos.Stdin
). Mise en mémoire tampon peut lire arbitrairement loin devant. (Dans ce cas précis, le plus tard doit êtrefmt.Fscanln(reader,x)
à lire à partir de la même tampon). - Je n'ai pas
fmt.Sscanln
œuvres, il devient "%v" après l'exécution de
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas quel est le problème avec le bloc
Qu'il fonctionne sur ma machine. Cependant, pour le bloc suivant, vous avez besoin d'un pointeur vers les variables que vous assignez l'entrée. Essayez de remplacer
fmt.Scanln(text2)
avecfmt.Scanln(&text2)
. N'utilisez pas deSscanln
, parce qu'il analyse une chaîne déjà en mémoire au lieu de partir de l'entrée standard. Si vous voulez faire quelque chose comme ce que vous essayiez de le faire, de le remplacer avecfmt.Scanf("%s", &ln)
Si cela ne fonctionne toujours pas, votre coupable pourrait être un peu bizarre les paramètres du système ou d'un buggy IDE.
ReadString('\n')
ouReadString("\n")
?rd
variables
commeif s,_ = rd.ReadString('\n'); true { s = strings.Trim(s, " \n") }
cannot use "\n" (type string) as type byte in argument to reader.ReadString
vous pouvez ainsi essayer:
fmt.Println(scanner.Err())
en dessous de la boucle for.Je pense que la plus standard de la manière de le faire serait:
Prendre un coup d'oeil à la
scan
godoc: http://godoc.org/fmt#Scanstops scanning at a newline and after the final item there must be a newline or EOF
donc pas pourquoi l'espace "pauses" il... je suppose que c'est un bugfmt.Scanln
etfmt.Scan
avec le courant de 2016 go version (go version go1.6.2 linux/amd64).fmt.Scanln()
Toujours essayer d'utiliser la bufio.NewScanner pour recueillir des informations à partir de la console. Comme d'autres l'ont mentionné, il y a plusieurs façons de faire le travail, mais le Scanner est à l'origine destiné à faire le travail. Dave Cheney explique pourquoi vous devriez utiliser le Scanner au lieu de bufio.Lecteur de ReadLine.
https://twitter.com/davecheney/status/604837853344989184?lang=en
Voici l'extrait de code de réponse pour votre question
Si vous ne voulez pas de programmation pour recueillir les entrées, il suffit d'ajouter ces lignes
La sortie du programme ci-dessus seront:
Programme ci-dessus recueille l'entrée de l'utilisateur et les enregistre dans un tableau. Nous pouvons également briser le flux avec un caractère spécial. Scanner fournit des API pour l'utilisation avancée comme le fractionnement à l'aide d'une fonction personnalisée, etc, la numérisation de différents types de flux e/S(Stdin, String) etc.
Une autre façon de lire plusieurs entrées dans une boucle qui permet de traiter une entrée avec espaces:
De sortie:
Essayez ce code:-
Scanf()
n'accepte pas les espaces dans la chaîne deJe suis en retard à la fête. Mais que pensez vous d'un liner:
os.Stdin
n'est pas " fin " c'est impossible de tout lire. Vous pourriez être en attente d'un moment...mail
.Peut également être fait comme ceci:-
Proprement lu dans un couple invité valeurs:
Voici un run:
Vous devez fournir un pointeur vers le var, vous souhaitez numériser, comme suit: