Command-Line Arguments in C

1. Overview

  • Command-Line Arguments: ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ํ„ฐ๋ฏธ๋„์—์„œ ์ „๋‹ฌํ•˜๋Š” ์ž…๋ ฅ๊ฐ’
    • argc: ์ „๋‹ฌ๋œ ์ธ์ž์˜ ๊ฐœ์ˆ˜ (ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„ ํฌํ•จ)
    • argv: ์ „๋‹ฌ๋œ ์ธ์ž๋“ค์„ ๋ฌธ์ž์—ด๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด
  • ๋ชฉ์ : ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰ ์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ์„ค์ •

2. argc & argv

int main(int argc, char *argv[]) {
    return 0;
}
๊ตฌ๋ฌธ์˜๋ฏธ
argcArgument Count, ์ธ์ž ๊ฐœ์ˆ˜
argvArgument Vector, ๋ฌธ์ž์—ด ํฌ์ธํ„ฐ ๋ฐฐ์—ด
argv[0]์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„ ๋˜๋Š” ๊ฒฝ๋กœ
argv[i]i๋ฒˆ์งธ ์ธ์ž ๋ฌธ์ž์—ด
argv[i][j]i๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ j๋ฒˆ์งธ ๋ฌธ์ž

์ž…๋ ฅ ์˜ˆ์‹œ

./run stories15M.bin -n 128 -t 0.8
IndexValue
argv[0]"./run"
argv[1]"stories15M.bin"
argv[2]"-n"
argv[3]"128"
argv[4]"-t"
argv[5]"0.8"
  • argc = 6
  • ๋ชจ๋“  argv ์›์†Œ๋Š” ๋ฌธ์ž์—ด์ด๋ฉฐ, ์ˆซ์ž๋„ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ๋จ
  • argv[argc]๋Š” NULL

3. ๋ฌธ์ž์—ด ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ

char *argv[];
  • char: ๋ฌธ์ž ์ž๋ฃŒํ˜•
  • char *: ๋ฌธ์ž์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ
  • char *argv[]: ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด
  • char *argv[]์™€ char **argv๋Š” main()์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ์—์„œ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์˜ˆ์‹œ:

argv[2]       // "-n"
argv[2][0]    // '-'
argv[2][1]    // 'n'
  • argv[2]: ์„ธ ๋ฒˆ์งธ ์ธ์ž ๋ฌธ์ž์—ด
  • argv[2][0]: ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž
  • argv[2][1]: ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž

4. ์ธ์ž ์ˆœํšŒ

for (int i = 2; i < argc; i += 2) {
    printf("%s: %s\n", argv[i], argv[i + 1]);
}
  • i = 2: ์„ธ ๋ฒˆ์งธ ์ธ์ž๋ถ€ํ„ฐ ์ˆœํšŒ
  • i < argc: ์ธ์ž ๋ฐฐ์—ด ๋ฒ”์œ„ ๊ฒ€์‚ฌ
  • i += 2: ์˜ต์…˜ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ํ•œ ์Œ์”ฉ ์ฒ˜๋ฆฌ
  • argv[i]: ์˜ต์…˜ ์ด๋ฆ„
  • argv[i + 1]: ์˜ต์…˜ ๊ฐ’

์ถœ๋ ฅ:

-n: 128
-t: 0.8

์œ„ ์ฝ”๋“œ๋Š” ์˜ต์…˜๊ณผ ๊ฐ’์ด ํ•ญ์ƒ ์Œ์œผ๋กœ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ์˜ˆ์‹œ์ด๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” i + 1 < argc ์—ฌ๋ถ€๋ฅผ ๋จผ์ € ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค.

5. ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ํ•จ์ˆ˜

๋ช…๋ นํ–‰ ์ธ์ž๋Š” ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ, ์ˆซ์ž ๋ณ€ํ™˜์ด๋‚˜ ๋ฌธ์ž์—ด ๋น„๊ต๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

ํ•จ์ˆ˜์—ญํ• ์˜ˆ์‹œ
strlen()๋ฌธ์ž์—ด ๊ธธ์ด ๋ฐ˜ํ™˜strlen("-n") โ†’ 2
strcmp()๋ฌธ์ž์—ด ๋น„๊ต๊ฐ™์œผ๋ฉด 0
atoi()๋ฌธ์ž์—ด โ†’ int"128" โ†’ 128
atof()๋ฌธ์ž์—ด โ†’ double"0.8" โ†’ 0.8

๋ฌธ์ž์—ด ๋น„๊ต

if (strcmp(argv[2], "-n") == 0) {
    printf("Step option\n");
}
  • strcmp()๊ฐ€ 0์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋‘ ๋ฌธ์ž์—ด์ด ๋™์ผํ•จ
  • ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ ๋น„๊ต์—๋Š” == ๋Œ€์‹  strcmp() ์‚ฌ์šฉ

์ˆซ์ž ๋ณ€ํ™˜

int steps = atoi(argv[3]);
float temperature = atof(argv[5]);
  • atoi(): ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜
  • atof(): ๋ฌธ์ž์—ด์„ ์‹ค์ˆ˜๋กœ ๋ณ€ํ™˜
  • atof()์˜ ๋ฐ˜ํ™˜ํ˜•์€ double์ด๋ฉฐ, float์— ๋Œ€์ž…ํ•˜๋ฉด ๋ณ€ํ™˜๋จ
  • ์—„๊ฒฉํ•œ ์ž…๋ ฅ ๊ฒ€์ฆ์ด ํ•„์š”ํ•˜๋ฉด strtol(), strtof() ์‚ฌ์šฉ

6. ์ž…๋ ฅ๊ฐ’ ๊ฒ€์‚ฌ

if (argc < 2) {
    printf("Missing arguments\n");
    return 1;
}
  • argc < 2: ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„ ์™ธ์— ์ธ์ž๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
  • return 1: ์˜ค๋ฅ˜ ์ƒํƒœ๋กœ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ

์˜ต์…˜ ํ˜•์‹ ๊ฒ€์‚ฌ:

if (argv[i][0] != '-') {
    return 1;
}
 
if (strlen(argv[i]) != 2) {
    return 1;
}
  • argv[i][0] != '-': ์˜ต์…˜์ด -๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ
  • strlen(argv[i]) != 2: ์˜ต์…˜์ด -n์ฒ˜๋Ÿผ ๋‘ ๊ธ€์ž์ธ์ง€ ๊ฒ€์‚ฌ

7. ํ•ต์‹ฌ ์ •๋ฆฌ

Terminal Input
      โ†“
main(argc, argv)
      โ†“
Argument Parsing
      โ†“
String Comparison / Type Conversion
      โ†“
Variables
      โ†“
Program Execution
  • argc: ์ž…๋ ฅ ๊ฐœ์ˆ˜ ๊ด€๋ฆฌ
  • argv: ์ž…๋ ฅ ๋ฌธ์ž์—ด ์ ‘๊ทผ
  • strlen(), strcmp(): ๋ฌธ์ž์—ด ๊ฒ€์‚ฌ ๋ฐ ๋น„๊ต
  • atoi(), atof(): ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜
  • for: ์—ฌ๋Ÿฌ ๋ช…๋ นํ–‰ ์˜ต์…˜์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ