Golang の Scanf 関数が Windows では失敗するのに、Mac では動作するのはなぜですか?

Patricia Arquette
リリース: 2024-10-26 17:43:02
オリジナル
881 人が閲覧しました

Why Does Golang's Scanf Function Fail on Windows But Work on Mac?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!