ホームページ  >  記事  >  バックエンド開発  >  Go で fmt.Scanf() が無効な入力による無限ループを引き起こすのはなぜですか?

Go で fmt.Scanf() が無効な入力による無限ループを引き起こすのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 04:23:30356ブラウズ

Why Does fmt.Scanf() Cause an Infinite Loop with Invalid Input in Go?

Go の fmt.Scanf で無効な入力を処理する方法

fmt.Scanf() の使用中に無効な入力に関する問題が発生した場合は、次のようになります。整数の代わりに文字列が入力されたときにプログラムが無限ループに陥る理由を理解するのに不可欠です。

Go では、fmt.Scanf() は特定の形式指定子 (例: "%d) の入力ストリームを解析します。 " 10 進整数の場合)。文字列などの無効な入力はエラーを引き起こしますが、入力は Stdin バッファーに残ります。その結果、その後の fmt.Scanf() の呼び出しでは同じ無効な入力が処理され続け、無限ループが発生します。

fmt.Scanln を使用した解決策

代替アプローチfmt.Scanln() を使用することですが、動作が異なります。無効な文字を含む入力行全体を読み取り、消費します。これは次のように実装できます:

<code class="go">fmt.Printf("Please enter an integer: ")

// Read in an integer
var i int
_, err := fmt.Scanln(&i)
if err != nil {
    fmt.Printf("Error: %s", err.Error())

    // If int read fails, read as string and forget
    var discard string
    fmt.Scanln(&discard)
    return
}
fmt.Printf("Input contained %d", i)</code>

追加オプション

fmt.Scanln() が最適でない場合、他のオプションは次のとおりです:

  • Stdin バッファのリセット: bufio.Reader.Reset() または bufio.NewReader() を使用してバッファをクリアします。
  • カスタム入力検証: 作成有効な入力が受信されるまで入力の読み取りと検証を繰り返すループ。
  • 専用の入力ライブラリを使用する: 入力処理をより詳細に制御できる bufio.Reader などのライブラリの使用を検討してください。

以上がGo で fmt.Scanf() が無効な入力による無限ループを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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