Ich möchte ein Programm erstellen, das den Benutzer zur Eingabe von Text zwingt, aber nicht erlaubt, etwas davon zu löschen. Was ist eine einfache Methode, dies in C zu tun? Das einzige, was ich habe, ist (c = getchar()) != EOF && c != '\b'
, die nicht funktioniert. Irgendwelche Ideen?Ignorieren der Rücktaste von der Standardeingabe
Antwort
POSIX - Unix-Version
#include <sys/types.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
int
main()
{
int fd=fileno(stdin);
struct termios oldtio,newtio;
tcgetattr(fd,&oldtio); /* save current settings */
memcpy(&newtio, &oldtio, sizeof(oldtio));
newtio.c_lflag = ICANON;
newtio.c_cc[VERASE] = 0; /* turn off del */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/* process user input here */
tcsetattr(fd,TCSANOW,&oldtio); /* restore setting */
return 0;
}
Sie können es nicht mit portierbarem Code machen - im Grunde hat jedes Betriebssystem eine Art von minimaler Pufferung/Bearbeitung, die in den Standard-Eingabestrom eingebaut ist.
Abhängig von den Betriebssystemen, auf die Sie zielen müssen, gibt es eine gute Änderung. Sie haben eine getch
zur Verfügung, die ungepuffert lesen wird. Unter Windows fügen Sie <conio.h>
hinzu und gehen Sie dafür. In den meisten Unix-Umgebungen müssen Sie curses (oder ncurses) dafür angeben (und darauf verlinken).
Falsch über Flüche. Siehe die akzeptierte Antwort. Es ist sehr einfach und portabel (POSIX). –
@R: Ich habe es angeschaut. Ich bin mir nicht sicher, ob es schon richtig ist und Flüche sind definitiv viel einfacher. –
Dies ist wahrscheinlich komplizierter als Sie sich vorstellen. Um dies zu tun, müssen Sie vermutlich die Kontrolle über das Echo der Zeichen übernehmen, die der Benutzer eingibt etc.
Werfen Sie einen Blick auf die Curses-Bibliothek. Die wgetch-Funktion sollte das sein, was Sie brauchen, aber zuerst müssen Sie Flüche usw. initialisieren. Lesen Sie die man-Seiten - wenn Sie Glück haben, werden Sie ncurses oder curses-intro man-Seiten finden. Hier ist ein Ausschnitt:
To initialize the routines, the routine initscr or newterm must be
called before any of the other routines that deal with windows and
screens are used. The routine endwin must be called before exiting.
To get character-at-a-time input without echoing (most interactive,
screen oriented programs want this), the following sequence should be
used:
initscr(); cbreak(); noecho();
Most programs would additionally use the sequence:
nonl();
intrflush(stdscr, FALSE);
keypad(stdscr, TRUE);
Wenn Sie nicht haben, dass manpage/für weitere Informationen, die einzelnen Funktions Mann Seiten nachschlagen.
- 1. Parsing von der Standardeingabe
- 2. Umleiten der Standardeingabe der Konsolenanwendung
- 3. Browser HTML von der Standardeingabe lesen
- 4. Verschachteln von Fgets mit der Standardeingabe
- 5. Verwenden der Rücktaste mit Ncurses
- 6. Wie ignoriere ich den nächsten int von der Standardeingabe
- 7. Deaktivieren der Rücktaste in WPF
- 8. So lesen Sie von der Standardeingabe mit der Fischschale
- 9. Lesen einer Ganzzahl aus der Standardeingabe
- 10. Deaktivieren der Rücktaste in Textfeld über Javascript
- 11. Rücktaste in der Array-Eingabe C++
- 12. Wie wird Zeile für Zeile von der Standardeingabe gelesen?
- 13. ein Zeichen von der Standardeingabe in Go lesen (ohne Enter)
- 14. Wie man eine Matrix von der Standardeingabe in Python liest
- 15. lesen Zeile für Zeile von der Standardeingabe Bash
- 16. Wie bekomme ich sed, um von der Standardeingabe zu lesen?
- 17. Wie lese ich einen einzelnen String von der Standardeingabe?
- 18. Umleiten der Standardeingabe und -ausgabe mit der Bash
- 19. SQLCE - Ignorieren der Abfrageausführung
- 20. Ignorieren von in der Warteschlange eingereihten Mausereignissen
- 21. JavaScript-Funktion Problem mit Rücktaste
- 22. Nginx ignorieren Teil der URL
- 23. Rücktaste der iPhone-Tastatur bewegt den Cursor zum nächsten Textfeld
- 24. asp Codebehind für die Taste als Rücktaste der Tastatur
- 25. onActivityResult wird nur nach dem Drücken der Rücktaste
- 26. Erkennen, wenn die Rücktaste in der Navigationsleiste angetippt wird
- 27. Regex: Ignorieren Reihenfolge der Gruppen
- 28. MiniProfiler zum Ignorieren der Seitenanforderung
- 29. Textfeld filtert Rücktaste
- 30. Ignorieren von Android-Komponententests abhängig von der SDK-Ebene
+1. Ich bin mir nicht bewusst, dass es im gekochten Modus möglich ist, nur einige Tasten zu deaktivieren. – Dummy00001
Dies ist unvollständig. Sie müssen auch^U deaktivieren oder der Benutzer kann immer noch die gesamte ausstehende Zeile löschen. Auch^W. Es kann mehr geben; prüfen. Eine sicherere Vorgehensweise wäre die vollständige Deaktivierung des ICANON-Modus. –
R. - Sie haben Recht. Die OP-Spezifikationen enthielten das nicht, IMO. Und Sie müssten die gesamten struct termios abschalten Möglichkeiten richtig lesen? Wie an anderer Stelle erwähnt, ist eine vollständige Lösung nicht das, was ich gepostet habe. –