C Programming, A Modern Approach - K.N.KINGμΌλ‘ CμΈμ΄λ₯Ό 곡λΆνλ©΄μ μ 리ν λ΄μ©μ
λλ€.
λ²μλ³Έ https://wikidocs.net/book/2494 μ μ°Έκ³ νμμ΅λλ€.
μμ€ νμΌμ ν¨μμ μΈλΆ λ³μμ μ μλΆλ₯Ό κ°κ³ μκ³ , ν€λ νμΌμ μμ€ νμΌκ° 곡μ ν μ 보λ₯Ό κ°κ³ μλ€.
C νλ‘κ·Έλ¨μ μ¬λ¬κ°μ μμ€ νμΌλ‘ λλ μ μλ€. κ° μμ€νμΌμ μ£Όλ‘ ν¨μμ λ³μλ€μ μ μκ° λ΄κ²¨ μμΌλ©° μμ€ νμΌλ€ μ€ νλλ λ°λμ νλ‘κ·Έλ¨μ μμμ μ μλ―Ένλ main ν¨μλ₯Ό κ°μ§κ³ μμ΄μΌ νλ€.
π νλ‘κ·Έλ¨μ μ¬λ¬ μμ€ νμΌλ‘ λλ λμ μ₯μ
1) κ΄λ ¨μ΄ μλ ν¨μ, λ³μλ€μ ν νμΌλ‘ λͺ¨μΌλ©΄ νλ‘κ·Έλ¨μ κ΅¬μ‘°κ° λͺ νν΄μ§λ€.
2) κ° μμ€ νμΌλ€μ λ°λ‘ μ»΄νμΌ μν¬ μ μμ΄ νλ‘κ·Έλ¨μ κ·λͺ¨κ° ν¬κ±°λ μμ£Ό μμ λλ κ²½μ° μκ°μ΄ μ μ½λλ€
3) ν¨μλ€μ λ°λ‘ μμ€ νμΌλ‘ μ 리ν΄μ£Όλ©΄ λ€λ₯Έ νλ‘κ·Έλ¨μμλ μ¬μ¬μ©ν μ μλ€. main ν¨μμ λ€λ₯Έ ν¨μλ€μ λΆλ¦¬ν¨μΌλ‘μ¨ λ€λ₯Έ νλ‘κ·Έλ¨μμ ν΄λΉ ν¨μ μ¬μ©μ΄ κ°λ₯ν΄μ§λ€.
#include μ§μμλ₯Ό ν΅ν΄ μ¬λ¬ μμ€ νμΌ κ° ν¨μ μν, 맀ν¬λ‘ μ μ, ν μ μ λ±κ³Ό κ°μ μ 보λ€μ 곡μ ν μ μλ€.
#include μ§μμλ μ μ²λ¦¬κΈ°μκ² μ£Όμ΄μ§ νμΌμ μ΄μ΄ κ·Έ λ΄μ©μ νμ¬ νμΌμ μ λΆ λΆμ¬λ£κΈ° λ§λ λ€. μ΄λ° μμΌλ‘ μΆκ°λλ νμΌλ€μ ν€λ νμΌ(header file)μ΄λΌκ³ λΆλ₯Έλ€.
π #include μ¬μ©
1) C μ체 λΌμ΄λΈλ¬λ¦¬μ μ‘΄μ¬νλ ν€λ νμΌμ μΆκ°ν λ
#include <filename>
μμ€ν
ν€λ νμΌλ€μ΄ μλ ν΄λμμ νμΌμ μ°Ύλλ€.
2) μ§μ μμ±ν΄μ€ ν€λ νμΌ λ±
#include "filename"
μ΄ κ²½μ° νμ¬ ν΄λμμ νμΌμ μ°Ύλλ€.
맀ν¬λ‘ μ μ, ν μ μλ€μ μμ€ νμΌλ€ κ°μ 곡μ ν΄μΌ ν λλ ν€λνμΌμ λ£μ΄μ£Όλ κ²μ΄ μ’λ€.
κ·Έλ¬λ©΄ μμ€ νμΌλ§λ€ μΌμΌμ΄ μ μλ₯Ό λ£μ΄μ€ νμκ° μμΌλ©° νλ‘κ·Έλ¨μ μμ νκΈ°κ° μ¬μμ§λ€. λν μμ€ νμΌλ€μ΄ μλ‘ κ°μ 맀ν¬λ‘μ νμ λ€λ₯΄κ² μ μνλ μΌμ λ§μ μ μλ€.
ν¨μμ μνμ΄ μ μλκΈ° μ μ νΈμΆλλ κ²μ λ§κΈ° μν΄ ν€λ νμΌμ ν¨μμ μνμ λ£μ΄μ£Όλ©΄ λλ€.
μλ₯Ό λ€μ΄ foo.cμ fλΌλ ν¨μκ° μ μΈλμ΄ μλ€λ©΄ foo.hλΌλ ν€λνμΌμ λ§λ€μ΄ fμ ν¨μ μνμ λ£κ³ , foo.hλ₯Ό foo.cμ fλ₯Ό νΈμΆνλ μμ€ νμΌμ μΆκ°ν΄μ€λ€.
π μμ (stack)
μΈλΆλ³μλ ν¨μμ κ°μ λ°©λ²μΌλ‘ νμΌλΌλ¦¬ 곡μ ν μ μλ€.
μλμ κ²½μ° iλ₯Ό μ μΈνκ³ μ μλ ν΄μ€λ€.
int i
λ§μ½ λ³μλ₯Ό μ μνμ§ μκ³ μ μΈλ§ ν΄μ£Όλ €λ©΄ extern ν€μλλ₯Ό μ΄μ©νλ©΄ λλ€.
extern int i;
μ΄ κ²½μ° μ»΄νμΌλ¬λ μ΄λ¬ν νμΌλ€μ λν΄ κ°κ° iμ 곡κ°μ μ λΆ ν λΉν΄μ£Όμ§λ μλλ€.
λ³μλ₯Ό νμΌ κ° κ³΅μ λ₯Ό ν λ λμΌν λ³μκ° μλ‘ λ€λ₯Έ νμΌμμ λ€λ₯΄κ² μ μΈλμ§ μλλ‘ μ£Όμν΄μΌ νλ€.
νμΌ κ° λ³μλ₯Ό 곡μ νλ κ²μ λͺ κ°μ§ λ¨μ λ€μ΄ μλ€.
ν€λ νμΌμμλ #include μ§μμλ₯Ό μ΄μ©ν μ μλ€.
μλ₯Ό λ€μ΄ stack.hμ boolean.h νμΌμ μΆκ°ν΄μ€ μ μλ€.
κ°μ ν€λ νμΌμ΄ λ λ² μΆκ°λλ κ²μ λ§μμ£Όμ΄μΌ νλ€. ν€λ νμΌμ 보νΈνκΈ° μν΄μλ νμΌμ λ΄μ©λ¬Όμ #ifndef-#endifλ‘ κ°μΈμ£Όλ©΄ λλ€.
#ifndef BOOLEAN_H
#define BOOLEAN_H
#define TRUE 1
#define FALSE 0
typedef int Bool;
#endif
μ΄ νμΌμ μ²μ μΆκ°ν λ BOOLEAN_H 맀ν¬λ‘κ° μ μλμ΄μμ§ μμΌλ―λ‘ μ μ²λ¦¬λ #ifndefμ #endif μ¬μ΄μ μ€λ€μ κ·Έλλ‘ λ΄λ²λ € λ κ²μ΄λ€. κ·Έλ¬λ λ€μμλ κ·Έ μ¬μ΄ μ€λ€μ μμ€λ€.
#error μ§μμλ μ£Όλ‘ ν€λ νμΌ μμμ ν€λ νμΌμ΄ μΆκ°λμ§ λ§μμΌ ν 쑰건λ€μ νμΈν λ μ¬μ©λκ³€ νλ€.
π μλ λΉνμ€ μ»΄νμΌλ¬ μ¬μ© λ°©μ§
#ifndef __STDC__
#error This header requires a Standard C compiler
#endif
π justify(ν μ€νΈ μμ νλ‘κ·Έλ¨)μ quote νμΌ λ£κΈ°
justify
C is quirky, flawed, and an
enormous success. Although accidents of history
surely helped, it evidently satisfied a need
for a system implementation language efficient
enough to displace assembly language,
yet sufficiently abstract and fluent to describe
algorithms and interactions in a wide variety
of environments.
-- Dennis M. Ritchie
μ΄ νλ‘κ·Έλ¨μ UNIX νΉμ Windows ν둬ννΈμμ μ€ννκΈ° μν΄μλ μλ λͺ λ Ήμ΄λ₯Ό μ€νν΄μΌ νλ€.
justify <quote
< (input redirection) : justifyκ° μ λ ₯μ ν€λ³΄λμμ λ°λ λμ OSλ‘ νμ¬κΈ quote λΌλ νμΌμμλΆν° λ°λλ‘ νλ€.
μ λͺ λ Ήμ΄λ₯Ό μ€ννκ³ λλ©΄ λ€μκ³Ό κ°μ΄ μΆλ ₯λλ€.
C is quirky, flawed, and an enormous success. Although
accidents of history surely helped, it evidently satisfied a
need for a system implementation language efficient enough
to displace assembly language, yet sufficiently abstract and
fluent to describe algorithms and interactions in a wide
variety of environments. -- Dennis M. Ritchie
output redirectionμ μ΄μ©νλ©΄ μ μ₯ν΄ μ€ μ μλ€.
μλ λͺ
λ Ήμ΄λ₯Ό ν΅ν΄ newquoteμ μΆλ ₯λ λ΄μ©μ μ μ₯ν μ μλ€.
justify <quote >newquote
justifyμ λν΄ μΆκ°μ μΌλ‘ μμ보면 λΆνμν λμ΄μ°κΈ°λ λΉ μ€μ΄ μ κ±°λμ΄ μ λ ¬λλ€. λν 20κ°μ λ¬Έμλ³΄λ€ λ κΈ΄ λ¨μ΄λ₯Ό μ½κ² λλ©΄ 20κ° μ΄νμ λ¬Έμλ€μ 무μνκ³ λ³νλ‘ λ체νλ€.
μλ₯Ό λ€μ΄ antidisestablishmentarianismλ antidisestablishment* λ‘ μΆλ ₯λλ€.
μ΄μ νλ‘κ·Έλ¨μ μ€κ³ν΄λ³΄μ. λ¨Όμ λ¨μ΄λ€μ λ΄κ³ μμ λ²νΌκ° νμνλ€. λ¨μ΄μ κ΄λ ¨λ ν¨μλ€μ ν νμΌ(word.c)μ λ£κ³ , μ€ λ²νΌμ κ΄λ ¨λ ν¨μλ€μ λ€λ₯Έ νμΌ(line.c)μ λ£μ μ μλ€. λ justify.cμ mainν¨μλ₯Ό λ£μ΄μ€λ€.
π word.c
#include <stdio.h>
#include "word.h"
int read_char(void)
{
int ch = getchar();
if (ch == '\n' || ch == '\t') {
return ' ';
}
return ch;
}
void read_word(char* out_word, int len) {
int ch = 0;
int pos = 0;
while ((ch = read_char()) == ' ') {
}
while (ch != ' ' && ch != EOF) {
if (pos < len) {
word[pos++] = ch;
}
ch = read_char();
}
word[pos] = '\0';
}
π line.c
#include <stdio.h>
#include <string.h>
#include "line.h"
#define MAX_LINE_LEN 60
char g_line[MAX_LINE_LEN + 1];
int g_line_len = 0;
int g_num_words = 0;
void clear_line(void)
{
g_line[0] = '\0';
g_line_len = 0;
g_num_words = 0;
}
void add_word(const char *word)
{
if (g_num_words > 0) {
g_line[g_line_len] = ' ';
g_line[g_line_len+1] = '\0';
g_line_len++;
}
strcat(g_line, word);
g_line_len += strlen(word);
g_num_words++;
}
int get_space_remaining(void)
{
return MAX_LINE_LEN - g_line_len;
}
void write_line(void)
{
int extra_spaces = MAX_LINE_LEN - g_line_len;
int space_to_insert = 0;
for (int i = 0; i < g_line_len; i++) {
if (g_line[i] != ' ') {
putchar(g_line[i]);
} else {
space_to_insert = extra_spaces / (g_num_words - 1);
for (int j = 1; j <= space_to_insert + 1; j++) {
putchar(' ');
}
extra_spaces -= space_to_insert;
g_num_words--;
}
}
putchar('\n');
}
void flush_line(void)
{
if (g_line_len > 0)
puts(g_line);
}
π justify.c
/* κΈμλ‘ μ΄λ£¨μ΄μ§ νμΌμ μ λ ¬ν΄μ€λ€. */
#include <string.h>
#include "line.h"
#include "word.h"
#define MAX_WORD_LEN 20
int main(void)
{
char word[MAX_WORD_LEN + 2];
int word_len;
clear_line();
for (;;) {
read_word(word, MAX_WORD_LEN+1);
word_len = strlen(word);
if (word_len == 0) {
flush_line();
return 0;
}
if (word_len > MAX_WORD_LEN) {
word[MAX_WORD_LEN] = '*';
}
if (word_len + 1 > space_remaining()) {
write_line();
clear_line();
}
add_word(word);
}
}
1) μ»΄νμΌ : νλ‘κ·Έλ¨μ κ° μμ€ νμΌλ€μ λ
립μ μΌλ‘ μ»΄νμΌλμ΄μΌ νλ€. (ν€λνμΌμ μ»΄νμΌν νμX)
κ° μμ€ νμΌλ§λ€ μ»΄νμΌλ¬λ λͺ©μ μ½λλ₯Ό ν¬ν¨νλ νμΌμΈ λͺ©μ νμΌ(object file)μ μμ±νλ€. windowsμμλ .obj νμ₯μλ₯Ό κ°μ§λ€.
2) λ§ν¬ : λ§μ»€λ μ λ¨κ³μμ μμ±ν λͺ©μ νμΌμ λΌμ΄λΈλ¬λ¦¬ ν¨μλ₯Ό μν μ½λμ μ°κ²°ν΄μ£Όμ΄ μ€ν κ°λ₯ν νμΌμ μμ±νλ€.
λͺ λ Ή μ€μ λͺ¨λ μμ€ νμΌμ μ λ κ²μ μκ° λλΉ μ΄λ―λ‘ UNIXλ λ©μ΄ν¬νμΌ(makefile)μ΄λΌλ κ°λ μ λ§λ€μλ€. λ©μ΄ν¬νμΌμ νμΌλ€μ μλ‘νλ©°, νμΌ κ°μ μ’ μμ±(dependencies)λν λͺ μνλ€.
π justify νλ‘κ·Έλ¨μ μν UNIX λ©μ΄ν¬νμΌ
justify: justify.o word.o line.o
gcc -o justify justify.o word.o line.o
justify.o: justify.c word.h line.h
gcc -c justify.c
word.o: word.c word.h
gcc -c word.c
line.o: line.c line.h
gcc -c line.c
1) κ·μΉ(rule) : κ° λΆλΆ
2) λͺ©ν(target) : κ° κ·μΉμ 첫 λ²μ§Έ μ€, κ·Έ λ€λ‘ μ’
μμ±μ΄ μλ νμΌλ€
3) λͺ
λ Ή(command) : λλ²μ§Έ μ€, λͺ©νκ° μ’
μλμ΄ μλ νμΌμ΄ μμ λμ΄ λͺ©νλ₯Ό μ¬κ΅¬μΆν΄μΌ ν κ²½μ° μ€ν
μλ₯Ό λ€μ΄ 첫λ²μ§Έ κ·μΉμμλ justifyκ° λͺ©νμ΄λ©° justifyκ° justify.o, word.o, line.oμ μ’ μλμ΄ μλ€. νλ‘κ·Έλ¨μ΄ κ°μ₯ μ΅κ·Όμ ꡬμΆλμμ λ μ΄ 3κ°μ§ μ€ νλλΌλ λ³κ²½μ¬νμ΄ μλ€λ©΄ justifyλ μ¬κ΅¬μΆμ ν΄μΌ νλ€.
μΆκ°μ μΌλ‘ gcc -c justify.cμμ -cλ justify.cλ₯Ό λͺ©μ νμΌλ‘ μ»΄νμΌνλ λ§ν¬λ νμ§ λ§λΌλ μλ―Έμ΄λ€.
μ΄λ°μμΌλ‘ νλ‘κ·Έλ¨μ μν λ©μ΄ν¬νμΌμ νμ±ν μ΄ν make κΈ°λ₯μ μ΄μ©νμ¬ νλ‘κ·Έλ¨μ ꡬμΆν μ μλ€. κ° νμΌμ μκ°, λ μ§λ₯Ό νμΈνμ¬ μ΅μ μ¬λΆλ₯Ό νλ¨ν μ μκ³ μ¬κ΅¬μΆμ΄ κ°λ₯νλ€.
π makeμ κ΄λ ¨νμ¬ μμμΌ νλ μ¬ν
1) λ©μ΄ν¬ νμΌμ κ° λͺ λ Ήμ μ€νμ΄μ€κ° μλ ν λ¬Έμλ‘ λμ΄ μ΄λ€.
2) λ©μ΄ν¬νμΌμ λ³΄ν΅ Makefile(λλ makefile)μ΄λΌλ μ΄λ¦μΌλ‘ μ μ₯νλ€.
3) makeλ₯Ό μ€ννλ €λ©΄ μλ λͺ λ Ήμ΄λ₯Ό μ€ννλ©΄ λλ€.
make target
μ¬κΈ°μ target(λͺ©ν)μ makefileμ μλ‘λ λͺ©νμ€ νλμ΄λ©° νΉμ λͺ©νλ₯Ό λͺ μνμ§ μμ κ²½μ° μ²« λ²μ§Έ κ·μΉμ λͺ©νλ₯Ό ꡬμΆνλ€.
μ»΄νμΌ λ κ²μΆνμ§ λͺ»ν λͺλͺ μ€λ₯λ€μ λ§ν¬ν λ κ²μΆλκΈ°λ νλ€. νΉν νλ‘κ·Έλ¨ λ΄μ μ΄λ€ ν¨μλ λ³μμ μ μκ° μλ΅λμ΄ μμ κ²½μ° λ―Έμ μλ κΈ°νΈ(undefined symbol) λλ λ―Έμ μλλ μ°Έμ‘°(undefined reference)μ κ°μ λ©μμ§λ₯Ό μΆλ ₯νλ€.
π λ§μ»€ μ€λ₯μ νν μμΈ
1) μ€ν
2) λλ½λ νμΌ
3) λλ½λ λΌμ΄λΈλ¬λ¦¬
νλ‘κ·Έλ¨μ λ€μ μ»΄νμΌ νλ κ²½μ° μκ°μ μ μ½νκΈ° μν΄ μ€λ‘μ§ μ΅κ·Ό λ³κ²½ μ¬νμ ν΄λΉνλ νμΌλ€λ§ μ¬μ»΄νμΌ ν΄μΌ νλ€.
μ¬μ»΄νμΌν΄μΌ νλ νμΌ(λ³νκ° μλ νμΌ)μ΄ λͺ κ°μΈμ§ 보기 μν΄μλ λ κ°μ§ κ²½μ°λ₯Ό κ³ λ €ν΄μΌ νλ€.
1) λ³νκ° μ€λ‘μ§ ν μμ€ νμΌμλ§ μν₯μ μ£Όλ κ²½μ°
μ΄ κ²½μ° ν΄λΉ νμΌλ§ μ¬μ»΄νμΌ λμ΄μΌ νλ€.
2) ν ν€λ νμΌμ μμ μ¬νμ΄ μμ κ²½μ°
μ΄ κ²½μ° ν΄λΉ ν€λ νμΌμ μΆκ°ν λͺ¨λ νμΌμ΄ μν₯μ λ°μ μ μμΌλ―λ‘ λͺ¨λ μ¬μ»΄νμΌν΄μΌ νλ€.
justify.c word.cλ μ¬μ»΄νμΌ νκ³ , line.cλ μ¬μ»΄νμΌ νμ§ μμλ λλ κ²½μ° μλμ λͺ λ Ήμ μ¬μ©νλ©΄ λλ€. (gcc μ»΄νμΌλ¬ κΈ°μ€)
gcc -o justify justify.c word.c line.o
line.cλ μ¬μ»΄νμΌ νμ§ μμλ λλ―λ‘ line.o λ₯Ό μ¬μ©νμλ€.
makefileμ μ¬μ©νλ μ₯μ μ€ νλλ μ¬κ΅¬μΆμ΄ μλμΌλ‘ μ²λ¦¬κ° λλ€λ κ²μ΄λ€. κ° νμΌμ λ μ§μ μκ°μ νμ ν ν μμ λ νμΌκ³Ό μ’ μλ νμΌλ€μ λͺ¨λ μ¬μ»΄νμΌ νλ€.
π justify νλ‘κ·Έλ¨μ μ¬κ΅¬μΆν κ²½μ° makeκ° νλ νλ
1) justify.cλ₯Ό μ»΄νμΌνμ¬ justify.o ꡬμΆ
2) word.c μ»΄νμΌ νμ¬ word.o ꡬμΆ
3) justify.o, word.o, line.oλ₯Ό λ§ν¬νμ¬ justify ꡬμΆ
νλ‘κ·Έλ¨ νμΌμ μμ νμ§ μκ³ λ 맀ν¬λ‘μ κ°μ μμ ν μ μλ€.
λλΆλΆμ μ»΄νμΌλ¬λ λͺ λ Ή μ€μμ 맀ν¬λ‘μ κ°μ μ ν μ μλ -D μ΅μ μ μ§μνλ€.
gcc -DDEBUG=1 foo.c
μ΄ κ²½μ° foo.cμμ DUBUG 맀ν¬λ‘μ κ°μ΄ 1λ‘ μ μλλλ€.
λν 맀ν¬λ‘λ₯Ό λ―Έμ μ μμΌμ£Όλ -U μ΅μ λ μ‘΄μ¬νλ€.