C Programming, A Modern Approach - K.N.KING์ผ๋ก C์ธ์ด๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
๋ฒ์ญ๋ณธ https://wikidocs.net/book/2494 ์ ์ฐธ๊ณ ํ์์ต๋๋ค.
13.1 String Literals
13.2 String Variables
13.3 Reading and Writing Strings
13.4 Accessing the Characters in a String
C์์๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด(String Literals)์ character๋ค์ array๋ก ์ทจ๊ธํ๋ค.
๋ฌธ์์ด์ ๋์์ ์๋ ค์ฃผ๊ธฐ ์ํด ์ถ๊ฐ์ ์ผ๋ก null character์ ๋ฃ์ด์ฃผ๋ฉฐ ์ด๋ \0์ผ๋ก ํํ๋๋ค. ์ด null character๋ก ์ธํด ์ปดํ์ผ๋ฌ๋ n ๊ธธ์ด์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ ์ฅํ๊ธฐ ์ํด n+1 byte๋ฅผ ํ ๋นํด์ค๋ค.
๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด ๋ฐฐ์ด์ผ๋ก์ ์ ์ฅ์ด ๋๋ฏ๋ก ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ char* ํ์ ๋ํ ํฌ์ธํฐ๋ก ์ทจ๊ธํ๋ค.
printf("abc");
์ด ๊ฒฝ์ฐ "abc"์ ์ฃผ์ ์ฆ, a ๋ฌธ์๊ฐ ์ ์ฅ๋ ๊ณณ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํด์ค๋ค. printf๋ ์ฒซ๋ฒ์งธ ์ ๋ ฅ๋ณ์์ ํฌ์ธํฐ๋ฅผ ๋ฐ๋๋ค.
๋ฌธ์์ด ๋ํ ์ฒจ์([])๊ฐ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
char ch;
ch = "abc"[1];
char date1[9] = "June 14";
์์ ๊ฒฝ์ฐ์ฒ๋ผ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ๋ฌธ์์ด ํฌ๊ธฐ+1๋ณด๋ค ํฌ๋ค๋ฉด ๋ฌธ์ ๋ฐฐ์ด์ ๋๋จธ์ง ์์๋ค์ \0์ผ๋ก ์ด๊ธฐํ๋๋ค.
๋ฌธ์์ด ๋ณ์๋ฅผ ์ ์ธํ ๋, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์๋ตํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ๊ณ์ฐํด์ค๋ค.
char date1[] = "June 14";
์ด ๊ฒฝ์ฐ ์์์ 8๊ฐ์ ๋ฌธ์๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ํ ๋น๋๋ค.
1) date๋ฅผ '๋ฐฐ์ด'๋ก ์ ์ธํ๊ธฐ
char date[] = "June 14";
char* date = "June 14";
๊ณตํต์ ) ๋ฌธ์ ๋ฐฐ์ด์ด๋ ๋ฌธ์ ํฌ์ธํฐ๋ฅผ ์ ๋ฌ๋ฐ๋ ํจ์์ ๊ฒฝ์ฐ ์ ๋ ฅ๋ณ์๋ก ๋ date๋ค ์ ๋ฌ ๋ฐ์ ์ ์๋ค.
๋ฌธ์์ด์ ์ฌ์ฉํ๋ ค๋ฉด ์ฌ์ฉํ๊ธฐ ์ด์ ์ ๋ฐ๋์ ๋ฌธ์ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๊ฒ ํด์ฃผ์ด์ผ ํ๋ค.
char str[STR_LEN+1];
char* p;
p = str;
์ด๋ ๊ฒ ํ๋ฉด p๊ฐ ๋ฌธ์์ด ๋ณ์(str์ ์ฒซ๋ฒ์งธ ๋ฌธ์)๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ๋๊ณ , p๋ฅผ ๋ฌธ์์ด์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
printf ์์ %s๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด์ ์จ์ค ์ ์๋ค.
char str[] = "Are you having fun yet?";
printf("%s", str);
// ๊ฒฐ๊ณผ
Are you having fun yet?
๋ฌธ์ ํ๋ํ๋ ์ฝ๋ค๊ฐ \0(null character)์ ๋ง๋๋ฉด ์ค๋จํ๋ค.
์ผ๋ถ๋ถ๋ง ์ถ๋ ฅํ๋ ค๋ฉด %.ps ๋ฅผ ์ฐ๋ฉด ๋๋ค.
(p : ์ถ๋ ฅํ ๋ฌธ์ ๊ฐฏ์)
ํน์ ๋ฒ์๋ด์์ ์ถ๋ ฅํ๋ ค๋ฉด %ms๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
(m : ํน์ ๋ฒ์)
๋ฌธ์์ด์ด m๋ณด๋ค ์ ์ ๋ฌธ์๋ฅผ ๊ฐ๋๋ค๋ฉด ๋ฒ์ ๋ด ์ฐ์ธก ์ ๋ ฌ
C์์๋ puts ๋ฅผ ์ด์ฉํด์ ์ถ๋ ฅ์ ํ ์๋ ์๋ค. puts ๋ ํ ๊ฐ์ง ์ ๋ ฅ๋ณ์๋ง ๋ฐ๋๋ค.
puts(str);
scanf ์์ %s๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด์ ์ฝ์ ์ ์๋ค.
scanf("%s", str);
str์ ํจ์๋ก ์ ๋ฌ๋๋ฉด ํฌ์ธํฐ ์ทจ๊ธ์ ๋ฐ์ผ๋ฏ๋ก &์ ๋ถ์ฌ์ฃผ์ง ์์๋ ๋๋ค.
scanf๋ ๋ฌธ์์ด์ ๋์ null character์ ์ ์ฅํด์ค๋ค.
scanf๋ ๊ณต๋๋ฌธ์๋ฅผ ์ฝ์ ์ ์๋ค
-> "gets"๋ฅผ ์ด์ฉํ์ฌ ํด๊ฒฐ
gets๋ ๊ณต๋๋ฌธ์๋ฅผ ์๋ตํ์ง ์์ผ๋ฉฐ, ๊ฐํ๋ฌธ์๋ฅผ ์ฐพ์ ๋ ๊น์ง ๊ณ์ ์ฝ๋๋ค. ๊ฐํ๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉด ๋ฐฐ์ด์ ๋ฃ์ง์๊ณ , ๊ทธ ์๋ฆฌ์ null character์ ๋ฃ๋๋ค.
** scanf์ gets๋ ๋ฐฐ์ด์ ๋ฌธ์๋ฅผ ์ฝ์ ๋ ๋ฐฐ์ด์ด ๊ฐ๋ ์ฐพ๋์ง ํ์ธ ๋ถ๊ฐํ๋ค. -> %s๋์ %ns, gets๋์ fgets๋ฅผ ์ด์ฉํ๋ฉด ์์ ํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
(n : ์ ์ฅํ ์ต๋ ๋ฌธ์ ๊ฐ์)
๋ณดํต์ ๋ฌธ์์ด์ ๋ฌธ์ ํ๋๋ง๋ค ์ฝ์ด์ฃผ๋ ์ ๋ ฅ ํจ์๋ฅผ ์ง์ ๋ง๋ ๋ค. (scanf, gets๋ ์์ ํ์ง x)
๐๋ฌธ์์ด ์ฝ๋ ํจ์ read_line
1. ๊ณต๋ ๋ฌธ์ ๋ฌด์x
2. ๊ฐํ๋ฌธ์(\n)์์ ์ฝ๊ธฐ ๋ฉ์ถค
3. ์ถ๊ฐ์ ์ธ ๋ฌธ์๋ ๋ฒ๋ฆฌ๊ธฐ
int read_line(char str[], int n)
{
int ch; // getchar()์ int๋ฅผ ๋ฐํํ๋ฏ๋ก
int i = 0;
while ((ch = getchar()) != '\n') { // ๊ฐํ๋ฌธ์๋ฅผ ๋ง๋ ๋๊น์ง
if (i < n) { // n๊ฐ ๊น์ง๋ง ๋ฐ๊ธฐ
str[i++] = ch; // ๋ฌธ์ ๋ฐฐ์ด์ ์ ์ฅ
}
}
str[i] = '\0'; // ๋ง์ง๋ง๊บผ๋ null character
return i; // ๋ฌธ์์ด ํฌ๊ธฐ
}
๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ์ ์ฅ๋๋ฏ๋ก ์ฒจ์ [] ๋ฅผ ์ด์ฉํ์ฌ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
๐๋ฐฐ์ด ์ฒจ์๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด ๋ด ๋์ด์ฐ๊ธฐ ๊ฐ์๋ฅผ ์ธ๋ ํจ์
int count_spaces(const char s[])
{
int count = 0;
int i;
for (i = 0; s[i] != '\0'; ++i) { // null character๋ง๋ ๋๊น์ง (๋ฌธ์์ด ๋๊น์ง)
if (s[i] == ' ') { // ๋์ด์ฐ๊ธฐ๋ฅผ ๋ง๋๋ฉด
++count; // count์ 1๋ํ๊ธฐ
}
}
return count;
}
์ค์ ๋ก๋ ๋ฐฐ์ด ์ฒจ์๋์ ํฌ์ธํฐ ์ฐ์ ์ ์ด์ฉํ์ฌ ์์ฑ
๐ํฌ์ธํฐ ์ฐ์ ์ ์ด์ฉํ์ฌ ๋ฌธ์์ด ๋ด ๋์ด์ฐ๊ธฐ ๊ฐ์๋ฅผ ์ธ๋ ํจ์
int count_spaces(const char *s)
{
int count = 0;
for (; *s != '\0'; ++s) { // s๊ฐ ๊ฐ๋ฆฌํค๋๊ฒ null character๊ฐ ์๋๋๊น์ง
if (*s == ' ') {
++count;
}
}
return count;
}
const๋ s๊ฐ ๊ฐ๋ฆฌํค๋ ๋์์ ๋ณดํธํ๋ ์ญํ ์ ํ๋ฏ๋ก s๋ ์์ ๊ฐ๋ฅํ๋ค
(s๋ ์ ์ด์ ํฌ์ธํฐ์ ๋ณต์ฌ๋ณธ)
โ ๋ฌธ์์ด์์ ๋ฌธ์์ ์ ๊ทผํ ๋๋ ๋งค๊ฐ๋ณ์์์๋ ์ฒจ์, ํฌ์ธํฐ ๋ญ ์ฐ๋ ์๊ด์๋ค.