GOLang Scanf エラー: Windows では失敗し、Mac では失敗しない理由
ユーザー入力を求めることは、プログラミングにおける一般的なタスクです。 GOLang では、この目的のために Scanf 関数がよく使用されます。ただし、Scanf を 2 回使用すると、特有の問題が発生します。つまり、macOS では動作しますが、Windows では動作しません。
提供されたコード スニペット内:
<code class="go">func credentials() (string, string) { var username string var password string fmt.Print("Enter Username: ") fmt.Scanf("%s", &username) fmt.Print("Enter Password: ") fmt.Scanf("%s", &password) return username, password }</code>
macOS で実行すると、プログラムはプロンプトを表示します。 user には、予想どおり、ユーザー名とパスワードが入力されます。ただし、Windows では、ユーザー名の入力を求められた後、プログラムはパスワードのプロンプトを無視し、突然終了します。
この不一致の理由は、Scanf がユーザー入力を解釈する方法にあります。 Windows では、Scanf はデフォルトの行終端文字としてキャリッジ リターン (r) を使用しますが、macOS では改行 (n) を使用します。ユーザー名を入力して Enter キーを押すと、Scanf はキャリッジ リターンを検出し、それを入力ターミネータとして解釈します。その結果、プログラムは 2 番目の Scanf 行をスキップして終了します。
Windows でこの問題を解決するには、I/O 操作のバッファリングを提供するライブラリである Bufio を使用できます。 Bufio は、より堅牢でオペレーティング システム間で一貫して動作する Scanf の代替手段を提供します。 Bufio を使用したコードの修正バージョンは次のとおりです。
<code class="go">func credentials() (string, string) { reader := bufio.NewReader(os.Stdin) fmt.Print("Enter Username: ") username, _ := reader.ReadString('\n') fmt.Print("Enter Password: ") password, _ := reader.ReadString('\n') return strings.TrimSpace(username), strings.TrimSpace(password) // ReadString() leaves a trailing newline character }</code>
このバージョンでは、ReadString を使用してユーザーからの入力を読み取ります。 ReadString は区切り文字を受け入れます。この場合は改行文字「n」です。これにより、行末記号が正しく処理されるため、Windows 上でもユーザー名とパスワードの両方が適切に読み取られることが保証されます。
要約すると、Scanf はオペレーティング システムが異なると一貫性のない動作を示します。これは、行末記号の規則が異なることが原因である可能性があります。 Bufio を使用することで、開発者はこれらの不一致を克服し、さまざまなプラットフォーム間でユーザー入力をキャプチャするためのより信頼性の高い方法に依存できます。
以上がGolang の Scanf 関数が Windows では失敗するのに、Mac では動作するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。