나는 사용자가 텍스트를 입력하도록 강요하지만 그 중 어떤 것도 지울 수 없도록하는 프로그램을 만들고 싶습니다. C에서 그 일을하는 간단한 방법은 무엇입니까?stdin에서 백 스페이스 키를 무시하십시오.
유일한 점은 (c = getchar()) != EOF && c != '\b'
입니다. 작동하지 않습니다. 어떤 아이디어?
나는 사용자가 텍스트를 입력하도록 강요하지만 그 중 어떤 것도 지울 수 없도록하는 프로그램을 만들고 싶습니다. C에서 그 일을하는 간단한 방법은 무엇입니까?stdin에서 백 스페이스 키를 무시하십시오.
유일한 점은 (c = getchar()) != EOF && c != '\b'
입니다. 작동하지 않습니다. 어떤 아이디어?
POSIX - 유닉스 버전
#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;
}
이식 가능한 코드로는 할 수 없습니다. 기본적으로 모든 OS에는 표준 입력 스트림에 내장 된 일종의 최소 버퍼링/편집 기능이 있습니다.
타겟팅해야하는 OS에 따라 버퍼가없는 읽기를 수행하는 getch
을 사용할 수있는 좋은 변화가 있습니다. Windows의 경우 <conio.h>
을 포함시켜야합니다. 대부분의 유닉스에서는 curses (또는 ncurses)를 포함시켜야한다.
curses에 대해 잘못되었습니다. 수락 된 답변을 참조하십시오. 매우 쉽고 이식성이 좋습니다 (POSIX). –
@R : 나는 그것을 보았다. 나는 그것이 아직 확실히 확실하지 않다. 그리고 curses는 명확히 훨씬 쉽다. –
이 가능성이 당신이 상상하는 것보다 더 복잡하다. 이렇게하려면 아마도 사용자가 입력하는 문자를 반향 제어 할 수 있어야합니다.
curses 라이브러리를 살펴보십시오. wgetch 함수는 필요한 것이어야하지만 먼저 커스 등을 초기화해야합니다. 맨 페이지를 읽으십시오. 운이 좋으면 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);
자세한 내용은 해당 기능 페이지를 참조하십시오.
+1. 나는 조리 모드에서 일부 키만 비활성화하는 것이 가능하다는 것을 알지 못합니다. – Dummy00001
이것은 불완전합니다.^U를 비활성화해야하거나 사용자가 보류중인 전체 줄을 지울 수 있습니다. 또한^W. 더있을 수 있습니다; 검사. 보다 안전한 방법은 ICANON 모드를 완전히 비활성화하는 것입니다. –
R. - 정확합니다. OP 사양에는 IMO가 포함되어 있지 않습니다. 그리고 가능성을 완전히 없애기 위해 struct termios 전체를 읽을 필요가 있을까요? 다른 곳에서 언급했듯이 완벽한 해결책은 제가 게시 한 것이 아닙니다. –