C에서는 String을 character array로 처리하기 때문에 분명 다른언어보다 문자열 처리가 어려운 반면에 Low Level의 문자처리가 가능한 장점이 있다.

 보통 C에서 쓰이는 gets()함수는 New Line Character ('\n')까지 글자를 받아들일 수 있는 장점이 있지만 Character Array의 저장공간이 넘어서 메모리에 까지 Character을 저장하기 때문에 주로 BOF Hacker의 공격대상이 된다. 이에 대한 버그를 수정하고 char을 array가 아니라 pointer로 처리하여 메모리의 낭비를 적게한 gets함수를 나름대로 수정해 보았다.

/* 입력된 글자가 저장되어 있는 양만큼의 메모리 포인터를 return */
/* Argument에 입력된 integer pointer에 입력된 문자의 수 return */

char *get_line2mem(int *char_num) {
     int n = -1;
     char temp;
     char *input;
     while(1) {
          temp = getch_linux();
          input = realloc(input, ++n * sizeof(char));
          input[n] = temp;
          if(temp == '\n') {
               input[n] = '\0';
               break;
           }
      }
     *char_num = n;
     return input;
}

Posted by WebPeace

 Windows/DOS 환경에서 지원하는 Turbo C에서는 "conio.h"라는 패키지에서 getch(), getche()함수를 지원한다. 하지만, gcc를 이용한 컴파일에 사용되는 glibc에는 stdio.h/stdlib.h를 눈을 뒤집어 쓰고 찾아봐도 위 함수를 지원하지 않는다.

 그럼 리눅스에서는 이런함수를 어떻게 대체해서 쓸까? 찾아본 결과, 아래와 같이 대체하여 쓸 수 있다고 한다!!

/* 꼭 include 해주도록 한다. */
#include <termios.h>
#include <unistd.h>

char getche_linux(void) {
    struct termios oldt, newt;
    int ch;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    ch = getchar();
    printf("%c", ch);
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    return ch;
}

 위의 진한 소스코드 부분을 조금더 응용하여, 진한 부분을

 printf("*");로 치환하게 되면 비밀번호를 입력하는 형태의 입력 방식을 구현할 수 있다. 또한 printf()명령을 사용하지 않으면 getch함수를 구현할 수 있다. (위의 함수는 getche()함수를 구현한 것이다.)

Posted by WebPeace

사실.. 아는 사람이 Tistory.com으로 이주했다는 소식을 들었는데..

베타 서비스에 아직 일반 사용자들이 이주하는 것이 안된다는 것으로 알고...;;

그냥, 관심 없이 보내다가...초대권에 혹하여 블로그를 시작하게 된

WebPeace라고 합니다..-_-;;;
P.S. 앞으로 싸이보다는 블로그에 치중할 것인가 그것이 문제로다...!!!


Posted by WebPeace

사이드바 열기