컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Tuesday, May 23, 2006

C언어-C프로그래밍] 복잡한 명령행 도움말을, printf() 함수 단 1개로 구현하기


가령 윈도우의 명령 프롬프트에서
dir /?
라고 하면 dir 명령에 대한 도움말이 다음과 같이 나옵니다:


※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
D:\Z>dir /?
디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.

DIR [드라이브:][경로][파일 이름] [/A[[:]특성]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]정렬 순서]] [/P] [/Q] [/S] [/T[[:]시간 필드]] [/W] [/X] [/4]

  [드라이브:][경로][파일 이름]
              나타낼 드라이브, 디렉터리 및/또는 파일을 지정합니다.

  /A          지정된 특성을 가진 파일을 보여줍니다.
  특성        D  디렉터리                   R  읽기 전용 파일
              H  숨김 파일                  A  기록 파일
              S  시스템 파일                -  부정을 뜻하는 접두사
  /B          최소 형식을 사용합니다 (머리말 정보나 요약 없음).
  /C          파일 크기에 1000단위로 분리 기호를 보여줍니다. 이것은 기본값
              입니다. 분리 기호를 표시하지 않으려면 /-C를 사용하십시오.
  /D          /W와 같으나 세로로 배열하여 보여줍니다.
  /L          소문자를 사용합니다.
  /N          파일 이름이 제일 오른쪽에 오도록 새로운 긴 목록 형식을
              사용합니다.
  /O          파일을 정렬된 순서로 보여줍니다.
  정렬순서    N  이름순(문자 순서)    S  크기순(작은 것 먼저)
              E  확장명순(문자 순서)  D  날짜/시간순(가장 이전 것 먼저)
              G  그룹 디렉터리 먼저         -  순서를 반대로 하는 접두 기호
  /P          정보가 한 화면에 꽉 차면 잠깐 멈춥니다.
  /Q          파일 소유자를 보여 줍니다.
  /S          지정한 디렉터리와 하위 디렉터리를 포함하여 보여줍니다.
  /T          정렬에 사용할 시간 필드를 지정합니다.
  시간필드   C  작성한 시간
              A  마지막 액세스한 시간
              W  마지막 기록한 시간
  /W          이름만 가로로 배열하여 보여줍니다.
  /X          8.3 파일 이름이 아닌 파일에 대한 짧은 이름을 보여줍니다.
              이 형식은 긴 이름 앞에 짧은 이름이 추가된 것으로 /N 형식과
              같습니다. 짧은 이름이 없으면 공백을 보여줍니다.
  /4          4자리수 연도를 표시합니다.

스위치를 DIRCMD 환경 변수로 미리 설정할 수 있습니다. 하이픈(-)을
스위치 앞에 접두 기호로 주면 미리 설정된 스위치에 우선합니다. (예, /-W)


D:\Z>



그런데 이런 도움말은 printf() 함수나 puts() 함수를, 다음과 같이 각 행별로 나열하여, 표현하는 것이 일반적인 것 같습니다.
printf(...
printf(...
printf(...
printf(...
...

C언어에서도, 펄(Perl)처럼 도움말을 좀 간단하게 표현하는 방법이 없는가 하고 생각해 본 끝에, 다음과 같은 방법을 찾아내었습니다. printf() 함수 1개로 모든 도움말을 한꺼번에 출력하는 것입니다. help() 함수 안의 첫부분에 있는 printf()가 그것입니다:

※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
#include <stdio.h>
#include <stdlib.h>

int help(void);

#define THIS_PROGRAM_VERSION "1.0"
char this_program_name[] = "FOO";


int main(int argc, char *argv[]) {

   if (argc == 1) help();
   puts(argv[1]);

   return 0;
}


int help(void) {
   printf("\n"
      "%s " THIS_PROGRAM_VERSION "\n"
      "\n"
      "Set Console Letter Color (Microsoft COLOR command compatible)\n"
      "\n\n"
      "Usage   : %s < Foreground Color >\n"
      "          %s < Background Color + Foreground Color >\n\n"
      "Example : %s f  :: Bright White\n"
      "          %s 1e :: Bright Yellow on Blue\n"
      "\n\n"
      "\t0 = Black (Invisible)               8 = Gray (Dark Gray)\n"
      "\t1 = Blue                            9 = Light Blue\n"
      "\t2 = Green                           A = Light Green\n"
      "\t3 = Aqua (Cyan)                     B = Light Aqua (Light Cyan)\n"
      "\t4 = Red                             C = Light Red\n"
      "\t5 = Purple (Magenta)                D = Light Purple (Light Magenta)\n"
      "\t6 = Yellow                          E = Light Yellow\n"
      "\t7 = White (Gray: System Default)    F = Bright White\n"
      "\n"
      , this_program_name,
        this_program_name, this_program_name,
        this_program_name, this_program_name
      );

   exit(EXIT_FAILURE);
}


참고로, 위의 소스는 제가 만들던 C프로그램([C언어] COLOR 명령 확장: 명령프롬프트 글자색 변경 유틸리티 setclr.exe 만들기)의 일부입니다. 위의 도움말의 내용 자체는 이 포스트와 상관이 없습니다.


"\n" 는 다음 줄로 행갈이 하라는 의미이고
"\t" 는 탭(공백 8개에 해당하는 긴 공백)을 의미합니다.


이 소스를 0.c 등의 적당한 이름으로 저장한 후, <비주얼 C>로 컴파일하여 실행시키면,

옵션이 하나도 없을 때는 위의 도움말이 다음과 같이 나옵니다:

D:\Z>0

FOO 1.0

Set Console Letter Color (Microsoft COLOR command compatible)


Usage   : FOO < Foreground Color >
          FOO < Background Color + Foreground Color >

Example : FOO f  :: Bright White
          FOO 1e :: Bright Yellow on Blue


        0 = Black (Invisible)               8 = Gray (Dark Gray)
        1 = Blue                            9 = Light Blue
        2 = Green                           A = Light Green
        3 = Aqua (Cyan)                     B = Light Aqua (Light Cyan)
        4 = Red                             C = Light Red
        5 = Purple (Magenta)                D = Light Purple (Light Magenta)
        6 = Yellow                          E = Light Yellow
        7 = White (Gray: System Default)    F = Bright White


D:\Z>






만약 옵션이 있을 때는 그 옵션 자체를 다음과 같이 화면에 출력하고, 도움말은 나오지 않습니다:

D:\Z>0 mwultong
mwultong

D:\Z>





tag: cpp
C언어 | C/C++ (Visual C++)

2 Comments:
At May 24, 2006 at 11:04 AM, Blogger mwultong said...

과찬이십니다 ^^;

사이트를 만들기 위해서 몇 년 동안 준비한 자료들을 블로그에 올리게 된 것입니다. 서버도 구하기 힘들고 해서요.

랄라라님의 블로그들이 발전해 가는 모습을 보면서 오히려 제가 감탄하고 있답니다.

(∩_∩)

 
At April 1, 2007 at 2:49 PM, Anonymous Anonymous said...

랄라라님의 코멘트:

* 으아.. mwultong님의 블로그에서 전문적인 정보가 늘어나는 것 같습니다. 컴맹인 저로서는 무슨 말인지 잘 몰라도 감탄이 나옵니다.

아래 방화벽 소프트웨어와 VBS 파일에 대한 글은 잘 읽었습니다. 도스의 BAT 파일에 해당하는 것이 VBS였군요..

여담이지만 mwultong님 블로그는 한 번 본 사람은 계속 오게끔 하는 것 같습니다. 워낙 유용한 정보가 많아서 꼭 다시와서 검색하여 읽게 하더군요.. 저도 블로그 고친다고 매일 와서 글 찾구요. ㅎㅎㅎ


(새 블로거 버전에서는, 랄라라님의 한글 아이디 글자가 깨져서, 다시 올립니다.)

 

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top