Tuesday, May 23, 2006
C언어-C프로그래밍] 복잡한 명령행 도움말을, printf() 함수 단 1개로 구현하기
가령 윈도우의 명령 프롬프트에서
dir /?
라고 하면 dir 명령에 대한 도움말이 다음과 같이 나옵니다:
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
그런데 이런 도움말은 printf() 함수나 puts() 함수를, 다음과 같이 각 행별로 나열하여, 표현하는 것이 일반적인 것 같습니다.
printf(...
printf(...
printf(...
printf(...
...
C언어에서도, 펄(Perl)처럼 도움말을 좀 간단하게 표현하는 방법이 없는가 하고 생각해 본 끝에, 다음과 같은 방법을 찾아내었습니다. printf() 함수 1개로 모든 도움말을 한꺼번에 출력하는 것입니다. help() 함수 안의 첫부분에 있는 printf()가 그것입니다:
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
참고로, 위의 소스는 제가 만들던 C프로그램([C언어] COLOR 명령 확장: 명령프롬프트 글자색 변경 유틸리티 setclr.exe 만들기)의 일부입니다. 위의 도움말의 내용 자체는 이 포스트와 상관이 없습니다.
"\n" 는 다음 줄로 행갈이 하라는 의미이고
"\t" 는 탭(공백 8개에 해당하는 긴 공백)을 의미합니다.
이 소스를 0.c 등의 적당한 이름으로 저장한 후, <비주얼 C>로 컴파일하여 실행시키면,
옵션이 하나도 없을 때는 위의 도움말이 다음과 같이 나옵니다:
만약 옵션이 있을 때는 그 옵션 자체를 다음과 같이 화면에 출력하고, 도움말은 나오지 않습니다:
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>
디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.
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);
}
#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>
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>
mwultong
D:\Z>
tag: cpp
C언어 | C/C++ (Visual C++)
과찬이십니다 ^^;
사이트를 만들기 위해서 몇 년 동안 준비한 자료들을 블로그에 올리게 된 것입니다. 서버도 구하기 힘들고 해서요.
랄라라님의 블로그들이 발전해 가는 모습을 보면서 오히려 제가 감탄하고 있답니다.
(∩_∩)
랄라라님의 코멘트:
* 으아.. mwultong님의 블로그에서 전문적인 정보가 늘어나는 것 같습니다. 컴맹인 저로서는 무슨 말인지 잘 몰라도 감탄이 나옵니다.
아래 방화벽 소프트웨어와 VBS 파일에 대한 글은 잘 읽었습니다. 도스의 BAT 파일에 해당하는 것이 VBS였군요..
여담이지만 mwultong님 블로그는 한 번 본 사람은 계속 오게끔 하는 것 같습니다. 워낙 유용한 정보가 많아서 꼭 다시와서 검색하여 읽게 하더군요.. 저도 블로그 고친다고 매일 와서 글 찾구요. ㅎㅎㅎ
(새 블로거 버전에서는, 랄라라님의 한글 아이디 글자가 깨져서, 다시 올립니다.)
<< Home