Heim >Backend-Entwicklung >Golang >Warum schlägt die Scanf-Funktion von Golang unter Windows fehl, funktioniert aber auf dem Mac?

Warum schlägt die Scanf-Funktion von Golang unter Windows fehl, funktioniert aber auf dem Mac?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 17:43:02964Durchsuche

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

GOLang Scanf-Fehler: Warum er unter Windows und nicht auf dem Mac fehlschlägt

Das Einholen von Benutzereingaben ist eine häufige Aufgabe bei der Programmierung. In GOLang wird zu diesem Zweck häufig die Scanf-Funktion verwendet. Allerdings tritt ein besonderes Problem auf, wenn Scanf zweimal verwendet wird: Es funktioniert unter macOS, aber nicht unter Windows.

Im bereitgestellten Code-Snippet:

<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>

Bei der Ausführung unter macOS fordert das Programm dazu auf Geben Sie erwartungsgemäß den Benutzernamen und dann das Kennwort ein. Unter Windows ignoriert das Programm jedoch nach der Aufforderung zur Eingabe des Benutzernamens die Aufforderung zum Passwort und wird abrupt beendet.

Der Grund für diese Diskrepanz liegt in der Art und Weise, wie Scanf Benutzereingaben interpretiert. Unter Windows verwendet Scanf den Wagenrücklauf (r) als Standardzeilenabschlusszeichen, während macOS den Zeilenumbruch (n) verwendet. Wenn der Benutzername eingegeben wird und der Benutzer die Eingabetaste drückt, erkennt Scanf den Wagenrücklauf und interpretiert ihn als Eingabeabschlusszeichen. Infolgedessen überspringt das Programm die zweite Scanf-Zeile und wird beendet.

Um dieses Problem unter Windows zu beheben, können wir Bufio verwenden, eine Bibliothek, die Pufferung für E/A-Vorgänge bereitstellt. Bufio bietet eine Alternative zu Scanf, die robuster ist und auf allen Betriebssystemen konsistent funktioniert. Hier ist eine modifizierte Version des Codes mit 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>

Diese Version verwendet ReadString, um Eingaben vom Benutzer zu lesen. ReadString akzeptiert ein Trennzeichen, in diesem Fall das neue Zeilenzeichen „n“. Dadurch wird sichergestellt, dass sowohl Benutzername als auch Passwort auch unter Windows richtig gelesen werden, da der Zeilenabschluss korrekt behandelt wird.

Zusammenfassend lässt sich sagen, dass Scanf auf verschiedenen Betriebssystemen ein inkonsistentes Verhalten zeigt, was auf unterschiedliche Zeilenabschlusskonventionen zurückzuführen ist. Durch den Einsatz von Bufio können Entwickler diese Inkonsistenzen überwinden und sich auf eine zuverlässigere Methode zur Erfassung von Benutzereingaben auf verschiedenen Plattformen verlassen.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Scanf-Funktion von Golang unter Windows fehl, funktioniert aber auf dem Mac?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn