C Programming, A Modern Approach - K.N.KING์ผ๋ก C์ธ์ด๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
๋ฒ์ญ๋ณธ https://wikidocs.net/book/2494 ์ ์ฐธ๊ณ ํ์์ต๋๋ค.
C์์๋ ๋ฌธ์์ด์ ๋ฐฐ์ด์ฒ๋ผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ๋ฅผ ํ๊ฑฐ๋ ๋น๊ต๋ฅผ ํ ์๊ฐ ์๋ค.
C์์๋ ์ด๋ฅผ ์ํ ํจ์๊ฐ ๋ด๊ธด ํค๋๊ฐ ์กด์ฌ
#include <string.h>
๐ strcpy ํจ์
char* strcpy(char* destination, const char* source);
source ๋ฌธ์์ด์ destination ๋ฌธ์์ด์ ๋ณต์ฌํด์ค๋ค.
(์ ํํ๋ source๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด์ destination์ด ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด์ ๋ณต์ฌ)
strcpy๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด์ ํ ๋นํ ์ ์๋ค.
str2 = "abcd"; (x)
strcpy(str2, "abcd"); (o)
strcpy(str1, str2); (o)
โ strcpy(str1, str2)๋ฅผ ํธ์ถํ ๋ str2๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด์ด str1์ด ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด์ ํฌ๊ธฐ์ ๋ง๋์ง ํ๋จ์ด ๋ถ๊ฐ๋ฅํ๋ค.
=> ๋ฌธ์์ด์ ๋ณต์ฌํ ๋ strncpy ํจ์๋ฅผ ํธ์ถํ๋๊ฒ ๋๋ฆฌ๋๋ผ๋ ์์ ํ๋ค.
๐ strncpy ํจ์ ์ฌ์ฉ ์์
strncpy(str1, str2, sizeof(str1));
์ด ๊ฒฝ์ฐ๋ str2๊ฐ ๋ ํฌ๋ฉด str1์ด null character๋ก ๋๋์ง ์๋๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋ ์์ ํ๋ค.
strncpy(str1, str2, sizeof(str1)-1);
str1[sizeof(str1)-1] = '\0';
๐ strlen ํจ์
size_t strlen(const char* str);
(size_t๋ unsingned integer ์ค ํ๋๋ฅผ ๋ํ๋ด๋ ํ ์ด๋ฆ)
strlen์ ๋ฌธ์์ด str์ '๊ธธ์ด'๋ฅผ ๋ฐํํ๋ค.
๋ฐฐ์ด์ด ์
๋ ฅ๋ณ์๋ก ์ฃผ์ด์ง ๊ฒฝ์ฐ ๋ฐฐ์ด ์์ฒด์ ๊ธธ์ด๊ฐ ์๋ ๋ฐฐ์ด์ ์ ์ฅ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ค.
๐ strcat ํจ์
char* strcat(char* destination, const char* source);
strcat์ ๋ฌธ์์ด source์ ๋ด์ฉ์ ๋ฌธ์์ด destination ๋์ ์ด์ด ๋ถ์ธ๋ค.
๐ strcat ํจ์ ์ฌ์ฉ ์์
strcpy(str1, "abc");
strcat(str1, "def"); // str1 : "abcdef"
๐ strncat ํจ์
char* strncat(str1, str2, sizeof(str1) - strlen(str1) -1);
strncat์ ๋ณต์ฌํ ๋ฌธ์์ ๊ฐ์์ ์ ํ์ ๋๋ฏ๋ก ๋ ๋๋ฆฌ์ง๋ง ์์ ํ๋ค.
strncat์ str1 ๋์ null character๋ฅผ ๋ฃ์ด์ฃผ๋๋ฐ ์ด๋ ์ธ๋ฒ์งธ ์
๋ ฅ๋ณ์์ ํฌํจ๋ ๊ฒ์ด ์๋๋ฏ๋ก ์ธ๋ฒ์งธ ์
๋ ฅ๋ณ์๋ ์ด๋ฅผ ๋ฃ์ด์ค ๊ณต๊ฐ์ ํ๋ณดํด๋์์ผ ํ๋ค.
๐ strcmp ํจ์
int strcmp(const char* str1, const char* str2);
strcmp๋ str1๊ณผ str2๋ฅผ ๋น๊ตํด str1์ด ๋ ์์ผ๋ฉด 0๋ณด๋ค ์์ ๊ฐ, ๊ฐ์ผ๋ฉด 0, ํฌ๋ฉด 0๋ณด๋ค ํฐ ๊ฐ์ ๋ฐํํ๋ค.
๋น๊ต๋ฅผ ํ ๋๋ ์ฌ์ ์ ์์๋ก ๋น๊ต๋ฅผ ํ๋ค. (๋ฌธ์๋ค์ด ํด๋นํ๋ ์ซ์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค)
๐ strcmp ํจ์ ์ฌ์ฉ ์์
if (strcmp(str1, str2) <0) { // st1 < str2 ?
}
๐ ASCII ๋ฌธ์์ด ์งํฉ์ ๋ช๊ฐ์ง ์ค์ํ ํน์ฑ๋ค
char* strcpy(char* destination, const char* source);
size_t strlen(const char* str);
char* strcat(char* destination, const char* source);
int strcmp(const char* str1, const char* str2);
๐ strlen ์ง์ ๊ตฌํ - (1)
size_t strlen(const char* str)
{
size_t size;
for (size = 0; *str != '\0'; ++str) {
++size;
}
return size;
}
๐ strlen ์ง์ ๊ตฌํ - (2) ์ข ๋ ์์ถ
null character์ ์ ์๊ฐ์ 0์ด๋ฏ๋ก str != '\0'์ str != 0๊ณผ ๊ฐ๊ณ , ์ด๋ฅผ ํ๋ณํด์ฃผ๋๊ฑด *str์ ํ๋ณํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
size_t strlen(const char* str)
{
size_t size = 0;
for (; *str++;) {
++size;
}
return size;
}
๐ strlen ์ง์ ๊ตฌํ - (3) while๋ฌธ ์ด์ฉ
size_t strlen(const char* str)
{
size_t size = 0;
while(*str++) {
++size;
}
return size;
}
์ ๋ฐฉ๋ฒ๋ค์ ์ฑ๋ฅ์ ๋์ผ
๐ strlen ์ง์ ๊ตฌํ - (4) ์ฑ๋ฅ ํฅ์ (์ผ๋ถ ์ปดํ์ผ๋ฌ)
size_t strlen(const char* str)
{
const char* orig_str = str;
while (*str) {
++str;
}
return str - orig_str;
}
size๋ฅผ ์ ์ธ ๋ฐ ์ฆ๊ฐ x
whlie ๋ฌธ์ ์๋์ ๊ฐ์ด ํํ๋ ๊ฐ๋ฅํ๋ค
while (*str++) {
}
โ ๊ฐ๋
์ฑ์ด ์ข์ง๋ ์์ผ๋ ์ฌ๋งํ๋ฉด for๋ฌธ์ ์ด์ฉํด '\0'์ ์ฐพ๊ณ ์์์ ๋๋ฌ๋ด๋ ๊ฒ์ด ์ข๋ค.
๐ strcat ์ง์ ๊ตฌํ - (1)
char* strcat(char* destination, const char* source)
{
char* ptr = destination;
while (*ptr != '\0') {
++ptr;
} // ptr์ด destination์ ๋์ ๊ฐ๋ฆฌํค๊ฒ ๋ง๋ค๊ธฐ
while (*source != '\0') {
*ptr = *source;
++ptr;
++source;
} // ptr์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ source ํ๋์ฉ ๋ณต์ฌํด์ ๋ฃ๊ธฐ
*ptr = '\0';
return destination;
}
๐ strcat ์ง์ ๊ตฌํ - (2) ๊ฐ์ํ
char* strcat(char* destination, const char* source)
{
char* ptr = destination;
while (*ptr) {
++ptr;
}
while (*ptr++ = *source++) {
}
*ptr = '\0';
return destination;
}
๊ฐ์ํ๋ strcat์ ํต์ฌ์ด ๋ฌธ์์ด ๋ณต์ฌ ๊ด์ฉ๊ตฌ
while (*ptr++ = *source++) {
}
source๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์๋ฅผ ptr์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๋ณต์ฌํด์ค ํ, ++์ฐ์ฐ์์ ์ํด ์ฆ๊ฐ๋๋ค.
while๋ฌธ์ ๋ณต์ฌ๋ ๋ฌธ์๋ฅผ ๊ฐ์ง๊ณ ํ๋จ์ ํ๋ฏ๋ก ๋ชจ๋ ๋ฌธ์๋ ๊ฐ์ด ์ฐธ์ด ๋์ด ๋ ๋ฌธ์๋ฅผ ๋ณต์ฌํ๊ธฐ ์ ๊น์ง ๋ฃจํ๋ ์ข
๋ฃ๋์ง ์๋๋ค. ๋ํ ๋ฃจํ๋ ๋ ๋ฌธ์ ํ ๋น ์ดํ์ ์ข
๋ฃ๊ฐ ๋๋ฏ๋ก ๋ฐ๋ก ๋ ๋ฌธ์๋ฅผ ๋ฃ์ด์ฃผ์ง ์์๋ ๋๋ค.
char planets[][8] = { "Mercury", "Venus", "Earth",
"Mars", "Jupiter", "Saturn",
"Uranus", "Neptune", "Pluto" };
์ด๋ฐ์์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ๋ฌธ์์ด์ ์ ์ฅํ ๊ฒฝ์ฐ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋น ๊ณต๊ฐ์๋ ๋ ๋ฌธ์๊ฐ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ์์ฌ ๊ณต๊ฐ์ด ์๋นํ ๋ฐ์ํ๋ค.
์ด๋ฅผ ์ํด ๊ฐ ์ด๋ค์ด ์๋ก ๋ค๋ฅธ ๊ธธ์ด๋ฅผ ๊ฐ์ง ์ ์๋ ์ด์ฐจ์ ๋ฐฐ์ด์ธ ๋๋๊ธฐ ๋ฐฐ์ด(ragged array)๊ฐ ํ์ํ๋ค.
์์๋ค์ด ๋ฌธ์์ด์ ๋ํ ํฌ์ธํฐ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ค๋ฉด ์ด๋ฌํ ๋ฐฐ์ดํ์ ํ๋ด๋ผ ์ ์๋ค.
planets๋ฅผ ๋ฌธ์์ด์ ๋ํ ํฌ์ธํฐ๋ค์ ๋ฐฐ์ด๋ก ๋ง๋ค๋ฉด ์๋์ ๊ฐ๋ค.
char* planets[] = { "Mercury", "Venus", "Earth",
"Mars", "Jupiter", "Saturn",
"Uranus", "Neptune", "Pluto" };
์ด๋ฐ์์ผ๋ก ํํํ ๊ฒฝ์ฐ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง๋ค์ด์ง๋ค.
planets์ ๊ฐ ์์๋ค์ ๋ ๋ฌธ์๋ก ๋๋๋ ๋ฌธ์์ด์ ํฌ์ธํฐ๋ค์ด๋ฉฐ planets์ ๋ฐฐ์ด์ ํฌ์ธํฐ๋ฅผ ์ํ ๊ณต๊ฐ์ด ํ ๋น๋๋ค.
ํ์ฑ ์ด๋ฆ์ ์ ๊ทผํ๋ ค๋ฉด planets ๋ฐฐ์ด์ ์ฒจ์๋ฅผ ์จ์ฃผ๋ฉด ๋๋ค.
๋ช ๋ นํ ์ ๋ณด๋ ์ด์์ฒด์ ๋ช ๋ น์ด ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฌํ ๋ช ๋ นํ ์ ๋ ฅ๋ณ์(command-line arguments(program parameter))์ ์ ๊ทผํ๋ ค๋ฉด mainํจ์์ ๋ณดํต argc์ argv๋ผ๋ ์ด๋ฆ์ ๊ฐ๋ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
๐ ๋ช ๋ นํ ์ ๋ ฅ๋ณ์์ ์ ๊ทผํ๊ธฐ
int main(int argc, char* argv[])
{
...
}
argc (argument count) : ๋ช
๋ นํ ์
๋ ฅ๋ณ์์ ๊ฐ์(ํ๋ก๊ทธ๋จ ์ด๋ฆ๋ ํฌํจ)
argv (argument vector) : ๋ฌธ์์ด๋ก ์ ์ฅ๋๋ ๋ช
๋ นํ ์
๋ ฅ๋ณ์๋ค์ ๋ํ ํฌ์ธํฐ๋ค์ ๋ฐฐ์ด
argv[0]์ ํ๋ก๊ทธ๋จ ์ด๋ฆ์ ๊ฐ๋ฆฌํค๊ณ , argv[1]๋ถํฐ arvg[argc-1]๊น์ง๋ ๋๋จธ์ง ๋ช ๋ นํ ์ ๋ ฅ๋ณ์๋ค์ ์๋ฏธํ๋ค.
argv[argc]๋ null pointer์ด๋ค.
๐ ๋ช ๋ นํ ์ ๋ ฅ๋ณ์ ์์
ls -l remind.c
argc = 3
argv[0] = program name
argv[1] = "-l"
argv[2] = "remind.c"
argv[3] = null pointer