๋ญํ๋ ํ๋ก๊ทธ๋จ์ธ๊ฐ์?
- ๋ชฉ์ : ํ๋ก๊ทธ๋จ ์คํ ์ ์ ๋ฌ๋ ๋ช ๋ นํ ์ธ์๋ค(๋ฌธ์์ด ์ซ์๋ค)์ ๋ชจ๋ ์ ์๋ก ๋ฐ๊ฟ ํฉ๊ณ๋ฅผ ๊ตฌํด ์ถ๋ ฅํฉ๋๋ค.
- ์ ๋ ฅ: argv[1], argv[2], …, argv[argc-1] (๊ฐ๊ฐ ์ซ์ ๋ฌธ์์ด์ด๋ผ๊ณ ๊ฐ์ )
- ์ถ๋ ฅ: ๋ชจ๋ ์ธ์์ ํฉ(longํ) ํ ์ค
๋์ ํ๋ฆ
- long s = 0; — ํฉ๊ณ๋ฅผ ์ ์ฅํ ๋ณ์ s๋ฅผ 0์ผ๋ก ์ด๊ธฐํ.
- for (int i = 1; i < argc; ++i) — ์ฒซ ๋ฒ์งธ ์ธ์(argv[1])๋ถํฐ ๋ง์ง๋ง ์ธ์๊น์ง ์ํ
(์ฃผ์: argv[0]์ ์คํ ํ์ผ ๊ฒฝ๋ก์ด๋ฏ๋ก ์ ์ธ) - atoi(argv[i]) — ๊ฐ ์ธ์๋ฅผ ์ ์๋ก ๋ณํํด ๋ฐํ.
๋ฐํ๊ฐ์ long์ผ๋ก ์บ์คํ ํด s์ ๋์ . - printf("%ld\n", s); — ์ต์ข ํฉ์ ์ถ๋ ฅ.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
long s = 0;
for (int i = 1; i < argc; ++i)
s += (long)atoi(argv[i]);
printf("%ld\n", s);
return 0;
}

์ ํ๋ก๊ทธ๋จ์ ๋ช ๋ นํ์ผ๋ก ์ ๋ฌ๋ ์ซ์ ์ธ์๋ค์ ๋ชจ๋ ๋ํ ๋ค, ๊ทธ ํฉ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
์คํ ์ argv[1]๋ถํฐ argv[argc-1]๊น์ง์ ๋ฌธ์์ด์ atoi() ํจ์๋ก ์ ์ํ์ผ๋ก ๋ณํํ์ฌ
long ํ ๋ณ์ s์ ๋์ ํ๊ณ , ๋ง์ง๋ง์ printf("%ld\n", s)๋ก ํฉ๊ณ๋ฅผ ์ถ๋ ฅํ๋ค.
argv[0]์ ํ๋ก๊ทธ๋จ ์ด๋ฆ์ด๋ฏ๋ก ์ ์ธํ๊ณ 1๋ถํฐ ๋ฐ๋ณตํ๋ค.
๋ณํ์๋ atoi๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ซ์๊ฐ ์๋ ๋ฌธ์์ด์ 0์ผ๋ก ์ฒ๋ฆฌ๋๋ค(์ ๋ ฅ ์ค๋ฅ์ ์ค์ 0์ ๊ตฌ๋ถํ์ง ๋ชปํ๋ค).
์ฌ์ฉ ์์
$ ./sum 10 20 30
60
$ ./sum -5 8 100
103
$ ./sum 3 foo 4
7 # "foo"๋ atoi๊ฐ 0์ผ๋ก ํด์
๊ฐ/๊ณต๊ฐ ๋ณต์ก๋
- ์๊ฐ: O(n) — ์ธ์ ์ n๋งํผ ํ ๋ฒ์ฉ ๋ณํ/๋ง์
- ๊ณต๊ฐ: O(1) — ๋์ ํฉ ๋ณ์๋ง ์ฌ์ฉ
์ฃผ์์ฌํญ (ํ๊ณ์ )
- ์๋ฌ ์ฒ๋ฆฌ ์์: atoi๋ ๋ณํ ์คํจ ์ 0์ ๋๋ ค์ค๋๋ค.
์ซ์๊ฐ ์๋ ์ธ์("foo" ๋ฑ)๋ฅผ ๋ฃ์ด๋ ์๋ฌ๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๊ณ 0์ผ๋ก ๋ํจ. - ์ค๋ฒํ๋ก์ฐ ์ํ: ํฐ ์(์: 64๋นํธ ๋ฒ์๋ฅผ ๋๋ ๋ฌธ์์ด)๋ฅผ atoi๋ก ์ฝ์ผ๋ฉด ์ ์๋์ง ์์ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ถํธ/๊ณต๋ฐฑ ์ฒ๋ฆฌ: atoi๋ ์ ํ ๊ณต๋ฐฑ์ ๋ฌด์ํ๊ณ ๋ถํธ(+/-)๋ ์ธ์ํ์ง๋ง, ์ง๋จ ๋ฉ์์ง๋ ์ ๊ณตํ์ง ์์ต๋๋ค.
๊ถ์ฅ ๊ฐ์ ์ : strtol ์ฌ์ฉ (์๋ฌ ๊ฒ์ถ)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
int main(int argc, char *argv[])
{
long s = 0;
for (int i = 1; i < argc; ++i) {
char *end = NULL;
errno = 0;
long v = strtol(argv[i], &end, 10); // 10์ง์
if (errno == ERANGE) {
fprintf(stderr, "overflow: %s\n", argv[i]);
return 1;
}
if (end == argv[i] || *end != '\0') {
fprintf(stderr, "not a valid integer: %s\n", argv[i]);
return 1;
}
if ((v > 0 && s > LONG_MAX - v) || (v < 0 && s < LONG_MIN - v)) {
fprintf(stderr, "sum overflow\n");
return 1;
}
s += v;
}
printf("%ld\n", s);
return 0;
}
- ์ฅ์ : ๋ณํ ์คํจ(์ซ์ ์๋), ๋ฒ์ ์ด๊ณผ(์ค๋ฒํ๋ก์ฐ)๋ฅผ ๋ช ํํ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌ ๊ฐ๋ฅ.
- ์ค๋ฌด/๊ณผ์ ์์ ์ ์ ๊น์ด์ง ์์ผ๋ ค๋ฉด strtol ๊ฐ์ ์์ ํ ๋ณํ ํจ์๋ฅผ ์ฐ๋ ๊ฒ ์ข์ต๋๋ค.
๐งฉ 1๏ธโฃ argc์ argv์ ๊ธฐ๋ณธ ๊ฐ๋
| argc | argument count → ํ๋ก๊ทธ๋จ ์คํ ์ ์ธ์์ ๊ฐ์ |
| argv | argument vector → ๊ฐ ์ธ์์ ๋ฌธ์์ด ํฌ์ธํฐ ๋ฐฐ์ด |
์ฆ,
ํ๋ก๊ทธ๋จ์ด ์ด๋ ๊ฒ ์คํ๋๋ค๋ฉด:
$ ./sum 10 20 30
๊ฐ ๊ฐ์ ์๋์ฒ๋ผ ์ ์ฅ๋ฉ๋๋ค.
| ์ธ๋ฑ์ค | ๋ด์ฉ |
| argv[0] | "./sum" (์คํ ํ์ผ ์ด๋ฆ) |
| argv[1] | "10" |
| argv[2] | "20" |
| argv[3] | "30" |
| argv[4] | NULL (๋ฐฐ์ด ๋ ํ์) |
๊ทธ๋ฆฌ๊ณ
โ๏ธ 2๏ธโฃ ๋ฐ๋ณต๋ฌธ์ ์กฐ๊ฑด: i < argc์ธ ์ด์
C ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ 0๋ถํฐ ์์ํ์ฃ .
๋ฐ๋ผ์ argv์ **๋ง์ง๋ง ์ค์ ์ธ์ ์ธ๋ฑ์ค๋ argc - 1**์
๋๋ค.
i < argc ๋ผ๋ ์กฐ๊ฑด์ ๋ค์์ ์๋ฏธํฉ๋๋ค:
i๊ฐ argc๋ณด๋ค ์์ ๋์ ๋ฐ๋ณต → ์ฆ, 1๋ถํฐ (argc - 1)๊น์ง ์คํ
์๋ฅผ ๋ค์ด ์ ์์์์:
- argc = 4
- argv[1], argv[2], argv[3] → ์ค์ ์ฌ์ฉ์ ์ ๋ ฅ ์ธ์
| i | argv[i] | ๊ฐ | ๋ฐ๋ณต ์ฌ๋ถ |
| 1 | "10" | 10 | โ ์คํ |
| 2 | "20" | 20 | โ ์คํ |
| 3 | "30" | 30 | โ ์คํ |
| 4 | NULL | โ ์คํ ์ ํจ (i < argc ์กฐ๊ฑด ๋๋ฌธ์ ์ข ๋ฃ) |
โ 3๏ธโฃ ๋ง์ฝ i <= argc์๋ค๋ฉด?
๊ทธ๋ผ ๋ง์ง๋ง ๋ฐ๋ณต์์ i == argc์ผ ๋
argv[i] == argv[argc] == NULL ์ด ๋ฉ๋๋ค.
์ฆ, ์ด๋ฐ ์ฝ๋๊ฐ ์ํ๋ผ์:
atoi(NULL); // ์ ์๋์ง ์์ ๋์(ํ๋ก๊ทธ๋จ ํฌ๋์ ๊ฐ๋ฅ)
๐ ์ธ๊ทธ๋ฉํ ์ด์ ์ค๋ฅ(Segmentation Fault) ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ทธ๋์ **ํญ์ i < argc**๋ก ํด์ผ ์์ ํฉ๋๋ค.
โ 4๏ธโฃ ์ ๋ฆฌ
| i < argc | ์ ํจํ ์ธ์(argv[1] ~ argv[argc-1])๊น์ง๋ง ์ ๊ทผ | ์ ์ ๋์ |
| i <= argc | ๋ง์ง๋ง์ argv[argc] = NULL ์ ๊ทผ | ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ |
๐ง ์ถ๊ฐ ํ
- argv[argc]๋ ํญ์ NULL๋ก ๋ณด์ฅ๋ฉ๋๋ค.
์ด๊ฑด ๋ฐ๋ณต๋ฌธ์ ๋ฉ์ถ๋ “์ข ๋ฃ ํ์(sentinel)” ์ญํ ์ด์์.
์ฆ, while(argv[i] != NULL) ๋ก๋ ์ํ ๊ฐ๋ฅํฉ๋๋ค. - ์:
for (int i = 1; argv[i] != NULL; i++)
printf("%s\n", argv[i]);
โ ๊ฒฐ๋ก
i < argc๋ argv์ ์ ํจํ ์ธ๋ฑ์ค ๋ฒ์(0 ~ argc-1)๋ง ์ ๊ทผํ๊ธฐ ์ํ ์์ ํ ์กฐ๊ฑด์ด์์.
๋ง์ฝ i <= argc๋ก ํ๋ฉด ๋ง์ง๋ง์ argv[argc] == NULL์ ์๋ชป ์ฐธ์กฐํด์ ์ค๋ฅ(์ธ๊ทธํดํธ) ๊ฐ ๋ ์ ์์ต๋๋ค.
argc์ argv
๋ ์ฌ์ค ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ "์ ๊ณต"ํ๋ ๋ณ์๋ค์ด ์๋๋๋ค.
์กฐ๊ธ ๋ ์ ํํ ๋งํ๋ฉด, ์ด ๋์ C ํ์ค ์ธ์ด์ ๋ฌธ๋ฒ์ ์ธ ์ฝ์(๊ท์ฝ, convention) ์ผ๋ก์
C ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ์ด์์ฒด์ (OS) ๊ฐ ์๋์ผ๋ก main ํจ์์ ์ ๋ฌํ๋ ์ธ์๋ค์ด์์.
๐งฉ 1๏ธโฃ ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด
argc์ argv๋ ํ์ค C์ main ํจ์ ์ธ์๋ก,
์ด๋ค ํค๋ ํ์ผ์๋ ์ ์๋์ด ์์ง ์์์.
์ด์์ฒด์ ๊ฐ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ main() ํจ์๋ก ์ ๋ฌํด์ค๋๋ค.
โ๏ธ 2๏ธโฃ ํ์ค ๋ฌธ๋ฒ (C ํ์ค์์์ ์ ์)
C ํ์ค์์ main ํจ์์ ํํ๋ ๋ ๊ฐ์ง์ ๋๋ค๐
int main(void) // ์ธ์ ์๋ ํํ
int main(int argc, char *argv[]) // ์ธ์ ์๋ ํํ
๋๋ ๋์ผํ๊ฒ ์๋์ฒ๋ผ ์จ๋ ๋ฉ๋๋ค:
int main(int argc, char **argv)
๐ ์ฌ๊ธฐ์:
- argc → argument count (์ธ์ ๊ฐ์)
- argv → argument vector (์ธ์๋ค์ ๋ฌธ์์ด ๋ฐฐ์ด)
์ด๊ฑด #include๋ก ๋ถ๋ฌ์ค๋ ๊ฒ ์๋๋ผ,
C ์คํ ํ๊ฒฝ(Runtime system)์ด main์ ํธ์ถํ ๋ ์๋์ผ๋ก ๊ฐ์ ์ฑ์ ๋ฃ์ต๋๋ค.
๐ง 3๏ธโฃ ๋ด๋ถ ๋์ ๊ตฌ์กฐ
์ด์์ฒด์ ๋ ํ๋ก๊ทธ๋จ์ ์คํํ ๋,
์ปค๋งจ๋๋ผ์ธ์์ ์
๋ ฅํ ์ธ์๋ค์ ์คํ์ ์ ์ฅํ ๋ค,
ํ๋ก๊ทธ๋จ์ main() ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ์ ๋ฌํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ ๋ช ๋ น์ ์คํํ๋ค๊ณ ํด๋ด ์๋ค:
$ ./test hello world
์ด์์ฒด์ ๊ฐ main()์ ํธ์ถํ ๋ ์ค์ ๋ก ์ด๋ฐ ์์ผ๋ก ์ ๋ฌํด์:
main(3, ["./test", "hello", "world"]);
| ๋ณ์ | ๊ฐ | ์ค๋ช |
| argc | 3 | ์ธ์์ ๊ฐ์ (argv[0], argv[1], argv[2]) |
| argv[0] | "./test" | ์คํ๋ ํ๋ก๊ทธ๋จ ์ด๋ฆ |
| argv[1] | "hello" | ์ฒซ ๋ฒ์งธ ์ธ์ |
| argv[2] | "world" | ๋ ๋ฒ์งธ ์ธ์ |
| argv[3] | NULL | ๋ฌธ์์ด ๋ฐฐ์ด์ ๋ ํ์ |
๐ก 4๏ธโฃ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ด๊ณ
| argc, argv | โ ์์ | main() ์ธ์๋ก ์ง์ ์ ๋ฌ๋จ |
| printf, atoi ๋ฑ | <stdio.h>, <stdlib.h> | ์ธ์๋ฅผ ์ฒ๋ฆฌํ ๋ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅ |
์ฆ, argc, argv๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ด๋ค ํค๋๋ฅผ includeํ ํ์๋ ์์ง๋ง,
์ธ์๋ฅผ ์ถ๋ ฅ(printf)ํ๊ฑฐ๋ ๋ฌธ์์ด์ ์ ์๋ก ๋ฐ๊พธ๋ ค๋ฉด(atoi)
๊ทธ์ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ includeํด์ผ ํฉ๋๋ค.
โ 5๏ธโฃ ์์ฝ ํ
| ์์ | C ํ์ค main ํจ์์ ์ธ์ (OS๊ฐ ์ ๋ฌ) |
| ์ ์ ์์น | ํค๋ ํ์ผ ์๋ — ์คํ ์ ์๋ ์ ๋ฌ |
| ์ฌ์ฉ ๋ชฉ์ | ํ๋ก๊ทธ๋จ ์คํ ์ ์ปค๋งจ๋๋ผ์ธ ์ธ์ ๋ฐ๊ธฐ |
| ์๋ฃํ | int argc, char *argv[] (๋๋ char **argv) |
| ์ข ๋ฃ ๊ท์น | argv[argc]๋ ํญ์ NULL ํฌ์ธํฐ |
โ ์ ๋ฆฌ ๋ฌธ์ฅ
argc์ argv๋ ํค๋ ํ์ผ์์ “์ ๊ณต๋๋” ๋ณ์๊ฐ ์๋๋ผ,
์ด์์ฒด์ ๊ฐ ํ๋ก๊ทธ๋จ ์์ ์ main() ํจ์๋ก ๋๊ฒจ์ฃผ๋ ์ธ์์ ๋๋ค.
์ฆ, “ํ์ค C์ ์ฝ์๋ ์ธํฐํ์ด์ค”๋ผ๊ณ ๋ณด๋ ๊ฒ ์ ํํฉ๋๋ค.
โ ์ฆ, ๋ค๊ฐ main()์ ์ ์ํ ๋ ์ธ์ ์ด๋ฆ์ ์ด๋ป๊ฒ ์ง๋ ,
OS๋ ํญ์ ์ฒซ ๋ฒ์งธ ์ธ์์๋ ์ธ์ ๊ฐ์,
๋ ๋ฒ์งธ ์ธ์์๋ ๋ฌธ์์ด ๋ฐฐ์ด ํฌ์ธํฐ๋ฅผ ์ ๋ฌํด์ค๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ ์ฝ๋๋ ์ ๋ถ ๋๋ฑํด์ ๐
int main(int a, char *b[])
int main(int count, char **list)
int main(int banana, char *apple[])
์ด๋ฆ์ด ๋ค ๋ฌ๋ผ๋,
์ด์์ฒด์ ๋ ํญ์
- ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์ → ์ธ์์ ๊ฐ์
- ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์ → ์ธ์๋ค์ ๋ฐฐ์ด ์ฃผ์
๋ก ์ ๋ฌํฉ๋๋ค.
โ ๏ธ 4๏ธโฃ ํ์ง๋ง “ํํ”๋ ์ค์ํจ
์ฆ, ์๋ฃํ์ ํํ๋ ๋ฐ๋์ ๋ง์์ผ ํฉ๋๋ค.
์ด์์ฒด์ ๋ main์ “๊ทธ ํํ๋๋ก” ํธ์ถํ๊ฑฐ๋ ์.
โ ๋ง๋ ์:
int main(int argc, char *argv[])
โ ํ๋ฆฐ ์ (ํํ๊ฐ ์ ๋ง์):
int main(char argc, char argv[]) // ์๋ฃํ ๋ถ์ผ์น → undefined behaviorโ
โ๏ธ ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋ค๊ฐ ์ด๋ ๊ฒ ์ ์ํ๋ค๋ฉด?
int main(int a, int b, int c)
์ด์์ฒด์ ๋ ์ฌ์ ํ
“main(int, char, char***)”** ํํ๋ผ๊ณ ์๊ฐํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
์ฆ, OS๋
“a์๋ ์ธ์ ๊ฐ์(int), b์๋ argv ๋ฐฐ์ด์ ์ฃผ์, c์๋ ํ๊ฒฝ๋ณ์(envp)์ ์ฃผ์”๋ฅผ ๋๊ธธ ๊ฑฐ์์.
๐ ์ค์ ํธ์ถ ๊ตฌ์กฐ ์์ (๋ฆฌ๋ ์ค ๊ธฐ์ค)
OS ๋ด๋ถ์์:
a ← argc (์: 4)
b ← argv์ ์ฃผ์ (์: 0x7ffce3b2)
c ← envp์ ์ฃผ์ (์: 0x7ffce3f0)
์ฆ,
b์ c๋ ์ฌ์ค “๋ฉ๋ชจ๋ฆฌ ์ฃผ์(ํฌ์ธํฐ)”์ธ๋ฐ,
ํ๋ก๊ทธ๋จ์ ๊ทธ๊ฑธ “์ ์”๋ผ๊ณ ์ฐฉ๊ฐํด์ ๋ฐ์๋ฒ๋ฆฝ๋๋ค.
โ ๏ธ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ค ์ผ์ด ์๊ธฐ๋?
| a (int) | ์ ์์ ์ผ๋ก ์ธ์ ๊ฐ์(์: 4)๊ฐ ๋ค์ด์ฌ ์ ์์ |
| b, c (int) | ์๋ ํฌ์ธํฐ์๋ ๊ฐ์ “์ฃผ์ ์ซ์๊ฐ”์ด ๊ฐ์ ๋ก ์ ์ฅ๋จ |
| ํ๋ก๊ทธ๋จ์์ b, c๋ฅผ ์ฐ๋ฉด | ์๋ฏธ ์๋ ๊ฐ, ์ ๊ทผ ์ ์ธ๊ทธํดํธ(segfault) ๋ฐ์ ๊ฐ๋ฅ |
์ฆ, ์ ์์ ์ผ๋ก ๋์ํ์ง ์์ต๋๋ค
๐ง ์ด์ ์์ฝ
์ด์์ฒด์ ๋ main์ ํธ์ถํ ๋ ํญ์
main(int, char **, char **)
ํํ๋ก ์คํ์ ์ธ์๋ฅผ ์ฌ๋ ค๋๊ณ ํธ์ถํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ค๊ฐ main์
main(int, int, int)
๋ก ์ ์ธํ๋ฉด,
์๋ฃํ ํด์์ด ์์ ํ ๋ฌ๋ผ์ ธ์.
- ์ฒซ ๋ฒ์งธ ์ธ์(argc)๋ ์ด ์ข๊ฒ ๋ง์
- ๋ ๋ฒ์งธ ์ธ์(argv)๋ ์๋ “๋ฌธ์์ด ๋ฐฐ์ด์ ์ฃผ์”์ธ๋ฐ
→ ํ๋ก๊ทธ๋จ์ “๋จ์ ์ ์”๋ก ํด์ - ์ธ ๋ฒ์งธ ์ธ์(envp)๋ ํฌ์ธํฐ์ธ๋ฐ
→ “์ ์ ๊ฐ”์ผ๋ก ํด์
์ฆ,
์คํ์ ๋์ง๋ง ๋ด์ฉ์ด ๋ค ๊ผฌ์
๋๋ค.
์์
#include <stdio.h>
int main(int a, int b, int c) {
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
์คํ
$ ./a.out hello
a = 2
b = 3273568912
c = 3273569120
- a๋ ์ฐ์ฐํ ์ธ์ ๊ฐ์๊ฐ ๋ง๊ฒ ๋ค์ด๊ฐ์ง๋ง,
- b, c๋ ์ฌ์ค argv, envp์ ์ฃผ์๊ฐ์ด ์ ์๋ก ์ฐํ ๊ฒ๋ฟ์ด์์.