ホームページ >バックエンド開発 >Golang >fmt.Scanln 予期しない改行エラー: fmt.Scan と fmt.Scanln の違いは何ですか?

fmt.Scanln 予期しない改行エラー: fmt.Scan と fmt.Scanln の違いは何ですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-23 21:27:02566ブラウズ

fmt.Scanln Unexpected Newline Error: What's the Distinction Between fmt.Scan and fmt.Scanln?

fmt.Scanln 予期しない改行エラー: Go の入力処理の詳細

多くの Go 開発者は、次の場合に「fmt.Scanln 予期しない改行エラー」に遭遇します。ユーザー入力と対話します。このエラーを理解するには、fmt.Scan と fmt.Scanln の仕組みを詳しく調べることが重要です。

fmt.Scan とスペース区切り入力
fmt.Scan reads space-標準入力から入力を分離します。 fmt.Scan に提供される各引数は、スペースで区切られた単一の単語または値に対応します。改行の存在はスペースとして扱われるため、複数行の入力が可能になります。これは、次のコードで例示されます。

<code class="go">import "fmt"

func main() {
  var i int
  _, err := fmt.Scan(&i)
  if err == nil {
    fmt.Println("read 1 integer: ", i)
  }
}</code>

入力「123」を指定すると、このコードは「read 1 integer: 123」を読み取り、出力します。

fmt.Scanlnおよび改行区切り入力
対照的に、fmt.Scanln は区切り文字として改行文字を期待します。改行まですべての入力を読み取った後、解析を停止します。これは、Scanln のドキュメントに明確に記載されています:

「Scanln は Scan に似ていますが、改行でスキャンを停止し、最後の項目の後には改行または EOF が必要です。」

この動作これは次のコードに現れます:

<code class="go">import "fmt"

func main() {
  var s string
  _, err := fmt.Scanln(&s)
  if err == nil {
    fmt.Println("read 1 line: ", s)
  }
}</code>

「みんなアイスクリームが大好き」と入力すると、このコードは「1 行読んで: みんなアイスクリームが大好き」を読み取って出力します。 fmt.Scanln は最後の改行でのみ区切られるため、スペースで区切られた "everybody" と "loves" が存在しても解析は中断されません。

エラーの理解
In提供された最初の例では、入力文字列「everybody love Ice Cream」が改行で終わっていないため、Scanln は「expected newline」というエラーを検出します。これを解決するには、入力の末尾に改行文字が存在する必要があります。

行を読み取るための代替方法
目的が入力行を読み取ることである場合は、ReadString を使用します。 bufio.Reader パッケージの fmt.Scanln:

<code class="go">import (
  "bufio"
  "os"
)

func main() {
  reader := bufio.NewReader(os.Stdin)
  line, err := reader.ReadString('\n')
  if err == nil {
    fmt.Println("read 1 line: ", line)
  }
}</code>
の信頼できる代替手段です。

以上がfmt.Scanln 予期しない改行エラー: fmt.Scan と fmt.Scanln の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。