Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erhalte ich Eingaben während der Ausgabe?

Wie erhalte ich Eingaben während der Ausgabe?

WBOY
WBOYnach vorne
2024-02-09 12:30:19634Durchsuche

Wie erhalte ich Eingaben während der Ausgabe?

PHP-Editor Apple stellt Ihnen heute eine häufig gestellte Frage: Wenn wir in PHP Benutzereingaben erhalten müssen, wie sollen wir diese ausgeben? Das Einholen von Benutzereingaben ist ein wichtiger Teil beim Schreiben interaktiver Programme. Daher ist es wichtig, die richtige Methode zu beherrschen. In PHP können wir einige integrierte Funktionen verwenden, um Benutzereingaben zu erhalten, z. B. die Funktion „fgets()“, um eine Zeile mit Benutzereingaben aus der Standardeingabe zu lesen, oder die Funktion „fgetc()“, um daraus zu lesen die Standardeingabe Nimm ein Zeichen. Natürlich können wir auch die superglobalen Variablen „$_GET“ oder „$_POST“ verwenden, um die vom Benutzer über das Formular übermittelten Daten zu erhalten. Unabhängig davon, welche Methode verwendet wird, müssen Sie auf die erforderliche Validierung und Filterung der Benutzereingaben achten, um die Sicherheit und Stabilität des Programms zu gewährleisten. Ich hoffe, dass die obige Einführung allen helfen kann!

Frageninhalt

Was ich implementieren möchte, ist eine Art Anwendung, die viele Informationen in der Konsole protokolliert (z. B. eine Zahl von 0 bis 1000000000000) und in der Lage ist, die Ausführung durch Eingabe eines Befehls in die Konsole zu stoppen (zum Beispiel „Stopp“).

Ich kam auf die Idee, Goroutine zu verwenden, kann den Befehl jedoch nicht eingeben, da sich das Eingabefeld in eine Ausgabe ändert.

Das ist mein Code:

package main

import (
    "bufio"
    "os"
)

var process bool = true

func commandHandler() {
    reader := bufio.NewReader(os.Stdin)
    for process {
        text, _ := reader.ReadString('\n')
        if text == "stop\r\n" {
            process = false
        }
    }
}

func task() {
    var i int64 = 0
    for ; i < 10000000000 || process; i++ {
        if i%30000000 == 0 { // Just to slow down an output for a while
            println(i)
        }
    }
}

func main() {
    go task()
    commandHandler()
}

Und die Ergebnisse, die ich erzielt habe. Die Buchstaben sind die Eingabe, die ich eingeben möchte, und die Zahlen sind die Ausgabe der App

Irgendwelche Vorschläge, wie ich in meiner Go-Anwendung die richtige Ein-/Ausgabe durchführen kann?

Problemumgehung

Ich kann den Befehl nicht eingeben, da sich das Eingabefeld in „Ausgabe“ ändert

Sie können Befehle wie gewohnt eingeben. Während Sie sie eingeben, werden sie auf Ihrer Konsole wiedergegeben. Dies wird mit allen anderen Ausgaben an der Konsole kombiniert, was den Benutzer verwirren kann – nicht jedoch den Computer.

Vorausgesetzt, dass dies tatsächlich zu Ihrem Betriebssystem passt, läuft Ihr Programm einwandfrei:

if text == "stop\r\n" {

Nicht auf meinem Betriebssystem r。更便携的方法是使用 strings.trimspace Alle Leerzeichen entfernen.

import (
  ...
  "strings"
) 
... 
...
        if strings.TrimSpace(text) == "stop" {

Mit dieser Änderung funktioniert der Code bei mir. Wie Sie sagten, werden die Ausgabe und die Eingabe in den Bildschirm eingefügt, Sie können jedoch weiterhin stop eingeben und das Programm beenden.

Irgendwelche Vorschläge, wie ich in meiner Go-Anwendung die richtige Ein-/Ausgabe durchführen kann?

Fast keine Terminalprogramme in der realen Welt sind interaktiv. Stattdessen stellen Befehlszeilenargumente und Umgebungsvariablen beim Aufruf die Konfiguration bereit. Die Shell-Umleitung wird normalerweise verwendet, um lange Ausgaben eines Programms (in einer Datei) oder auf einer Seite (z. B. |less) beizubehalten.

Man sieht viele akademische Programme, die das interaktive Terminalmodell verwenden, bei dem das Programm den Benutzer auffordert und Daten sammelt, aber in der realen Welt ist dies sehr selten und oft eine unkluge Komplikation. Standardeingaben werden in der Regel verwendet, um Dateneingaben bereitzustellen, die für Berechnungen erforderlich sind, und nicht durch Benutzerbefehle (z. B. Daten, die manipuliert oder gefiltert werden soll).

Wie @tinkerer vorgeschlagen hat, können Signale bereits zum Beenden Ihres Programms verwendet werden (Details sind betriebssystemspezifisch). Sie müssen sich also wirklich keine Gedanken darüber machen, wie die Terminalanwendung mit der visuellen Darstellung der Standardeingabe und -ausgabe umgeht, die nur zum Beenden des Programms interpoliert werden. Es gibt viele andere Signale in der Posix-Umgebung, von denen einige vollständig benutzerorientiert sind und für jeden Zweck verwendet werden können.

Sobald die Laufzeit komplexere Benutzereingaben erfordert, warten Programme normalerweise auf Befehle an einem Socket. Für solche Programme werden Webschnittstellen, die HTTP-Dienste bereitstellen, aufgrund ihrer Einfachheit und Zugänglichkeit immer häufiger verwendet.

Das obige ist der detaillierte Inhalt vonWie erhalte ich Eingaben während der Ausgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen