2011-11-16 5 views
3

J'utilise ceci, pour collecter une entrée et afficher l'entrée alors, mais quand je le fais comme ça le texte "quelque chose" sera affiché dans une nouvelle ligne, mais je veux le texte à afficher dans la même ligne, des idées?bufio.NewReader crée toujours une nouvelle ligne:/

func main() { 
    fmt.Println("Example") 
    print("example: ") 
    in := bufio.NewReader(os.Stdin); 
    input, err := in.ReadString('\n'); 
    if err != nil { 
     fmt.Println("Error: ", err) 
    } 

    fmt.Println(input, "something") 
} 

Répondre

2

fmt.Println() ajoute automatiquement une nouvelle ligne à la fin de sa sortie.

Vous pouvez essayer d'utiliser Printf, qui prend une "chaîne de format" et une liste d'entrées.

Un exemple serait:

func main() { 
    fmt.Println("Example") 
    print("example: ") 
    in := bufio.NewReader(os.Stdin); 
    input, err := in.ReadString('\n'); 
    if err != nil { 
     fmt.Println("Error: ", err) 
    } 

    fmt.Printf("something : %s", input) 
} 

Dans ce cas,% s est un espace réservé pour un type de chaîne. Tous les espaces réservés se trouvent dans le GoDoc fmt: http://golang.org/pkg/fmt/

Aussi, si l'entrée elle-même a une nouvelle ligne à la fin, vous pouvez utiliser Trim du paquet strings pour retirer le caractère \ n.

+0

Est-il possible d'utiliser ceci avec de la corde? "fmt.Printf (string:% s, input)" ne fonctionne pas :( –

+0

Le premier argument doit être de type string (par exemple: entre guillemets), tous les arguments suivants doivent correspondre aux types d'espace réservé dans l'ordre. Il imprimera la première chaîne en l'état, le remplacement des espaces réservés au besoin autre exemple:. 'fmt.Printf (« l'int est:% d, la chaîne est% s », 3, "une chaîne.") ' (% d s'applique au type int,% s s'applique à la chaîne) – Robbie

3

Découpez la nouvelle ligne à partir de input. Par exemple,

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
    "strings" 
) 

func main() { 
    fmt.Println("Example") 
    print("example: ") 
    in := bufio.NewReader(os.Stdin) 
    input, err := in.ReadString('\n') 
    if err != nil { 
     fmt.Println("Error: ", err) 
     return 
    } 
    fmt.Println(strings.TrimRight(input, "\n"), "something") 
} 

Entrée/Sortie:

Example 
example: some input 
some input something 
+0

Bien, mais j'obtiens l'erreur suivante:" panique: erreur d'exécution: tranche les limites hors limites " –

+0

Fonctionne pour moi. Si 'err' est non-nul et' input' est vide, vous devriez appeler 'os.Exit (1)' ou 'panic (err)' ou 'return' ou au moins mettre le second' fmt.Println() 'dans le bloc else. – mkb

+0

Si vous exécutez la version révisée avec l'instruction return, quelle erreur obtenez-vous? – peterSO

0

Sur les fenêtres (pas sûr si cela est pertinent) aucune des réponses précédentes a travaillé pour moi. Voici donc la résolution que je trouve sur: https://groups.google.com/d/msg/golang-nuts/hWoESdeZ398/qDbTogJhj88J qui relie à https://play.golang.org/p/_9N_RwmBvd

L'idée de base est que, plutôt que d'utiliser strings.TrimRight(input, "\n") vous devez inclure un \r caractère, comme strings.TrimRight(input, "\r\n")
Ce résout le problème des postes d'observation.

Code OP avec suppression d'entrée fixe! PS: Désolé pour le necro J'espère juste pour sauver quelqu'un de perdre 20 minutes de googling!

Questions connexes