web-dev-qa-db-ja.com

コンソール行から入力を読み取る方法

コマンドラインから入力を読みたいのですが、入力を求めるプロンプトが表示される前にプログラムが終了してしまいました。 C#で Console.ReadLine() と同等のものを探しています。

これは私が現在持っているものです:

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)
}
215
Dante

ブロックの何が問題なのかわからない

reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)

それは私のマシン上で動作します。ただし、次のブロックには、入力を割り当てている変数へのポインタが必要です。 fmt.Scanln(text2)fmt.Scanln(&text2)に置き換えてみてください。 Sscanlnは使用しないでください。標準入力からではなく、すでにメモリ内にある文字列を解析するためです。自分がやろうとしていたようなことをしたいのなら、それをfmt.Scanf("%s", &ln)に置き換えてください。

それでも問題が解決しない場合は、原因が変わったシステム設定やバグのあるIDEなどです。

233
LinearZoetrope

あなたも試してみることができます:

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

if scanner.Err() != nil {
    // handle error.
}
101
Helin Wang

これを行うためのより標準的な方法は次のようになると思います。

package main

import "fmt"

func main() {
    fmt.Print("Enter text: ")
    var input string
    fmt.Scanln(&input)
    fmt.Print(input)
}

scan godocを見てください: http://godoc.org/fmt#Scan

Scanは標準入力から読み込まれたテキストをスキャンし、連続したスペース区切りの値を連続した引数に格納します。改行はスペースとして数えます。

ScanlnはScanに似ていますが、改行でスキャンを停止し、最後の項目の後に改行またはEOFがなければなりません。

76
Pith

コンソールから入力を収集するには、常に bufio.NewScanner を使用するようにしてください。他の人が述べたように、仕事をする複数の方法がありますが、Scannerはもともと仕事をすることを意図しています。 Dave Cheneyが、bufio.ReaderのReadLineの代わりにScannerを使用する理由を説明します。

https://Twitter.com/davecheney/status/604837853344989184?lang=ja

これがあなたの質問に対するコードスニペットの答えです。

package main

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

/*
 Three ways of taking input
   1. fmt.Scanln(&input)
   2. reader.ReadString()
   3. scanner.Scan()

   Here we recommend using bufio.NewScanner
*/

func main() {
    // To create dynamic array
    arr := make([]string, 0)
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("Enter Text: ")
        // Scans a line from Stdin(Console)
        scanner.Scan()
        // Holds the string that scanned
        text := scanner.Text()
        if len(text) != 0 {
            fmt.Println(text)
            arr = append(arr, text)
        } else {
            break
        }

    }
    // Use collected inputs
    fmt.Println(arr)
}

プログラム的に入力を収集したくない場合は、これらの行を追加するだけです。

   scanner := bufio.NewScanner(os.Stdin)
   scanner.Scan()
   text := scanner.Text()
   fmt.Println(text)

上記のプログラムの出力は次のようになります。

Enter Text: Bob
Bob
Enter Text: Alice
Alice
Enter Text:
[Bob Alice]

上記のプログラムはユーザー入力を集めてそれらを配列に保存します。その流れを特別なキャラクターで破ることもできます。 Scannerは、カスタム関数などを使った分割、さまざまなタイプのI/Oストリーム(Stdin、String)などのスキャンなどの高度な使用法のためのAPIを提供します.

9
Naren Yellavula

スペースを含む入力を処理できるループ内で複数の入力を読み取る別の方法

package main
import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    var text string
    for text != "q" {  // break the loop if text == "q"
        fmt.Print("Enter your text: ")
        scanner.Scan()
        text = scanner.Text()
        if text != "q" {
            fmt.Println("Your text was: ", text)
        }
    }
}

出力:

Enter your text: Hello world!
Your text was:  Hello world!
Enter your text: Go is awesome!
Your text was:  Go is awesome!
Enter your text: q
9
Chiheb Nexus

このコードを試してください: -

var input string
func main() {
      fmt.Print("Enter Your Name=")
      fmt.Scanf("%s",&input)
      fmt.Println("Hello "+input)
      }
4
SSALPHAX

私はパーティーに遅れた。しかし、1つのライナーはどうでしょうか。

data, err := ioutil.ReadAll(os.Stdin)
3

このようにすることもできます: -

package main
import "fmt"     

func main(){
    var myname string
fmt.Scanf("%s", &myname)           
fmt.Println("Hello", myname)       
}
3
Nitin yadav

いくつかのプロンプト値をきれいに読んでください。

// Create a single reader which can be called multiple times
reader := bufio.NewReader(os.Stdin)
// Prompt and read
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Print("Enter More text: ")
text2, _ := reader.ReadString('\n')
// Trim whitespace and print
fmt.Printf("Text1: \"%s\", Text2: \"%s\"\n",
    strings.TrimSpace(text), strings.TrimSpace(text2))

これが実行です。

Enter text: Jim
Enter More text: Susie
Text1: "Jim", Text2: "Susie"
2
Rohanthewiz

次のように、スキャンしたい変数へのポインタを指定する必要があります。

fmt.scan(&text2)
0
Liam Mertens