我想制作一个强制用户输入文本但不允许他删除任何文本的程序,在 C 中做这件事的简单方法是什么?
我唯一得到的就是(c = getchar()) != EOF && c != '\b'
这不起作用。有任何想法吗?
POSIX - Unix 版本
#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;
}
你不能用可移植的代码来做到这一点——基本上每个操作系统都在标准输入流中内置了某种最小的缓冲/编辑。
根据您需要定位的操作系统,您将有一个很好的更改getch
,可以进行无缓冲读取。在 Windows 上,您包含<conio.h>
并继续使用它。在大多数 Unix 上,您需要为其包含(并链接到)curses(或 ncurses)。
这可能比你想象的要复杂。为此,您可能需要控制回显用户正在输入的字符等。
看看 curses 库。wgetch 函数应该是您需要的,但首先您需要初始化 curses 等。阅读手册页 - 如果幸运的话,您会找到 ncurses 或 curses-intro 手册页。这是一个片段:
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);
如果您没有该手册页/了解更多信息,请查看各个函数手册页。