fgets로 문자열을 입력 받고 있습니다.
그런데 백스페이스를 누르면 이상한 문자가 출려되더군요...^H요거였나....
이게 저런 문자가 출력이 안되고 문자가 지워지게 하려면 어떻게 해야 하나요???
백스페이스키가 동작 안 하면 Ctrl-H 해 보셔요.
세벌 https://sebuls.blogspot.kr/
대개 터미널에서 ERASE 문자는 '\x7f'(^?), 즉 ASCII DELETE 문자입니다.
'\x7f'
stty -a 명령을 사용해 보면 확인 가능하지요. 아마 erase = ^?로 나올 겁니다.
stty -a
이 문자를 입력하면 정상적으로 사용이 가능합니다. 대개 Ctrl+Backspace 같은 커맨드로 입력할 수 있는데요. fgets 함수를 사용하는 프로그램을 재컴파일하기 귀찮은 경우에는 그렇게 쓸 수 있지요.
이 문제를 제대로 해결하려면 음...
1. GNU Readline 같은 라이브러리의 힘을 빌리면 됩니다.
https://ko.wikipedia.org/wiki/GNU_readline
2. 라이브러리 의존이 부담스럽다면, 터미널을 직접 제어해서 ERASE 문자를 ^H로 바꾸는 방법으로도 간단히 해결이 가능하지요. 간단한 예시 코드 드리겠습니다. 저도 나중에 활용할 수 있겠군요.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <termios.h> #define BUF_LEN 80 static struct termios orig_term; static int set_erase(char); static void tty_recover(void); int main(){ char str[BUF_LEN]; size_t i, len; if(set_erase('\x08')) return 1; fgets(str, sizeof(str), stdin); printf("length = %u\nstr = ", (unsigned int)(len = strlen(str))); fputs(str, stdout); fputs("bytes dump:", stdout); for(i=0;i<len;i++){ printf("\n%#02x " + !!(i&0xf), 0xff & str[i]); } fputc('\n', stdout); return 0; } int set_erase(char erase){ struct termios term; if (isatty(STDIN_FILENO) == 0) return 1; // stdin is not a terminal device if (tcgetattr(STDIN_FILENO, &term) < 0) return 1; // tcgetattr error memcpy(&orig_term, &term, sizeof(struct termios)); if(atexit(tty_recover)) return 1; // atexit error term.c_cc[VERASE] = erase; if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term) < 0) return 1; // tcsetattr error return 0; } void tty_recover(void){ tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_term); return; }
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
백스페이스키가 동작 안 하면 Ctrl-H 해 보셔요.
백스페이스키가 동작 안 하면 Ctrl-H 해 보셔요.
세벌 https://sebuls.blogspot.kr/
일반적으로 터미널에서 ERASE 문자는 '\x7f'(
대개 터미널에서 ERASE 문자는
'\x7f'
(^?), 즉 ASCII DELETE 문자입니다.stty -a
명령을 사용해 보면 확인 가능하지요. 아마 erase = ^?로 나올 겁니다.이 문자를 입력하면 정상적으로 사용이 가능합니다. 대개 Ctrl+Backspace 같은 커맨드로 입력할 수 있는데요.
fgets 함수를 사용하는 프로그램을 재컴파일하기 귀찮은 경우에는 그렇게 쓸 수 있지요.
이 문제를 제대로 해결하려면 음...
1. GNU Readline 같은 라이브러리의 힘을 빌리면 됩니다.
https://ko.wikipedia.org/wiki/GNU_readline
2. 라이브러리 의존이 부담스럽다면, 터미널을 직접 제어해서 ERASE 문자를 ^H로 바꾸는 방법으로도 간단히 해결이 가능하지요.
간단한 예시 코드 드리겠습니다. 저도 나중에 활용할 수 있겠군요.
댓글 달기