5

我想制作一个强制用户输入文本但不允许他删除任何文本的程序,在 C 中做这件事的简单方法是什么?

我唯一得到的就是(c = getchar()) != EOF && c != '\b'这不起作用。有任何想法吗?

4

3 回答 3

5

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;        
}
于 2010-07-02T17:27:46.330 回答
3

你不能用可移植的代码来做到这一点——基本上每个操作系统都在标准输入流中内置了某种最小的缓冲/编辑。

根据您需要定位的操作系统,您将有一个很好的更改getch,可以进行无缓冲读取。在 Windows 上,您包含<conio.h>并继续使用它。在大多数 Unix 上,您需要为其包含(并链接到)curses(或 ncurses)。

于 2010-07-02T17:21:55.953 回答
2

这可能比你想象的要复杂。为此,您可能需要控制回显用户正在输入的字符等。

看看 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);

如果您没有该手册页/了解更多信息,请查看各个函数手册页。

于 2010-07-02T17:49:22.253 回答