C 언어로 프로그램을 생성하는 과정을 먼저 알아보려 합니다.



//Helloworld.c
#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    
}

Helloworld.c

(Compile)

Helloworld.obj    -> (Conversion) Helloworld.lib

(Link)             |

Helloworld.exe   <- (Link)

(Build)

Resource compile


exe 파일을 만들기 까지 많은 과정을 거친다는 것을 알 수 있습니다.

lib 파일이나 obj 파일을 상대에게 제공하면 원본 소스를 감출 수 있어 본인의 노력을 허무하게 뺏기는 일을 예방할 수 있습니다.


  전처리기는 컴파일러에게 명령을 지시하는 것으로 앞서 보신 Helloworld.c 파일에서 #include <stdio.h>와 같이 해쉬태그(#)로 시작하며, 세미콜론(;)을 사용하지 않습니다.

  여기서 <꺽쇠>로 감싸면 시스템이 제공하는 헤더파일을 뜻하며, "큰 따옴표"로 감싸면 사용자가 만든 프로젝트의 경로에서 검색한 뒤 시스템 경로를 탐색하는 두번의 과정을 거치게 됩니다.

  컴파일러 제조회사가 라이브러리 파일을 제공하며 사용자가 함수를 호출하면 운영체제에 관계없이 동일하게 동작할 수 있도록 합니다.


표준입출력함수

  표준입출력 함수는 출력시스템에 상관없이 표준화된 함수를 뜻합니다.

  데이터를 모니터에 입출력할 수 있는 기능을 제공해주는 표준 함수 및 라이브러리 함수 입니다.

printf, scanf( 여기서 f는 format을 뜻함)

printf( const char *format(출력형식), [argument](출력할 변수]..)


%d(decimal) %f(float) %lf(double) %c/%C(char) %s/%S(string (char[](char*)))

%u(unsigned int) %x/%X(hexadecial) %o(octa) %e(exponential) %p(메모리주소)


*문자c 와 문자열s 는 소문자일 경우 단일바이트를, 대문자일 경우 와이드문자(8비트보다 큰 문자)를 출력하거나 받습니다. 16진수 x는 소문자일 때 ffffff를, 대문자일때 FFFFFF를 입력하거나 출력합니다. 



표준출력함수

모니터에 출력하기 위해 라이브러리 파일에서 제공하는 함수들의 모음입니다.

일반적으로 돈이라고 불리는 \ 표시의 뒤에 붙으며, 종류는 다음과 같습니다.

\n: 개행(printf에서 \n == \n\r) 

\r: 라인의 앞으로 커서(Caret)를 옮깁니다. 여기서 커서는 cmd.exe를 실행했을 때 깜박이는 그것입니다. 정확히는 캐럿이라고 부르셔야 합니다.

\a: 비프음

\b: 백스페이스

\t: 탭

\': 작은따옴표

\": 큰따옴표

\\: 원표시(\)출력

예외상황에서 적용될 키워드는 반복해주시면 극복하실 수 있습니다.("100%%" -> 100%)


출력형식화(Formatted IO)

%(-) "자리수" : 왼쪽정렬

%(+) "자리수" : 오른쪽정렬

%(0) "자리수": 0으로 공백을 매꿉니다. 0이 뒤에 있을 경우, 값 오류를 불러올 수 있어 앞에 붙습니다.


ex)

 

int data = 23;
printf("[%-5d], [%05d]",data,data);

결과 -> [23   ], [00023]


실수형 출력 형식화는 다음과 같습니다.

%(-)"전체자리수"."소수부자리수"

만약 실수가 자리수를 넘어가는 경우 무조건 소수점 마지막 자리에서 반올림을 실시합니다.


ex)


double data = 2.175678;
printf("[%-7.2f], [%07.2lf], [%.0lf]", data, data, data);

결과 -> [2.18   ], [0002.18], [2]


scanf

scanf는 사용자가 입력한 정보들을 변수에 저장하기 위한 변수입니다.

visual studio에서 scanf만 쓰시면 간혹 혹은 자주 에러가 날 수 있습니다. 보안이슈로 인해 scanf_s를 강권하고 있습니다만 무시하고 싶으시다면 프로젝트 생성과정에서 SDL(Security Development Lifecycle) 검사(C)를 체크해제하시면 사용 가능합니다.


scanf(const char *format(입력형식) [,argument](입력받을 변수));


포인터형으로 입력받을 변수의 자료형 설정을 확실하게 해야 합니다.

scanf 사용시 스페이스를 사용하면 문제가 생길 수 잇어 gets()함수를 이용하여 공백까지 모두 읽습니다.

스캔에 실패하면 0을 반환합니다.

잘못된 입력을 방지하기 위해 fflush(stdin) 을 통해 키보드 버퍼를 초기화하면 생각치 못한 스캔 오류들을 방지할 수 있습니다.


변수(Variable)


  변수는 상수(Constant)와 달리 프로그램의 실행주기 동안 값을 변경하면서 사용할 수 있는 정보입니다. 어떤 데이터 혹은 연산결과들을 메모리에 저장하고 이를 사용할 때 사용합니다. RAM에 할당하는 만큼 이 변수가 얼마의 자리를 차지하는 지를 알려줘야 합니다. 이를 위해 자료형을 변수의 앞에 씀으로써 컴퓨터에 선언할 수 있는 것입니다.


  지역변수(Local Variable): 지역변수는 지역변수 선언을 포함하는 method 본문에 제어가 들어가면 나타나고, method 밖을 벗어나면 소멸하는 변수입니다. method와 생명주기를 같이하며, stack에 저장됩니다. 초기화 하지 않을경우 알 수 없는 값이 들어있으며, 다른 함수에서 참조하기 위해서는 포인터를 사용해야 합니다. 즉, 사용하기 전 원하는 값으로 초기화를 해줘야 합니다.


  전역변수(Global Variable): 전역변수는 지역변수와 달리 프로그램이 끝날 때 까지 프로그램 어디서든 사용 가능한 변수를 말합니다. Data segment에 저장되며, 초기화를 하지 않으면 0으로 자동 초기화되는 성질을 가지고 있습니다. 전역변수는 함수를 가져갈 때 전역변수 또한 모두 데리고 가야하므로 함수의 독립성이 약화됩니다.


  정적변수(Static Variable): 특정함수에서만 사용할 수 있는 전역변수를 말합니다. 지역변수 처럼 특정 영역에서만 사용하지만 전역변수처럼 메모리에 할당된 공간을 유지하고, 변수를 반환해도 소멸하지 않는 특징을 가지고 있습니다.


  외부변수(External Variable): 외부변수는 extern이라는 키워드를 사용하여 다른 소스파일에서 참조할 수 있도록 한 변수입니다. extern 키워드를 사용하더라도 static이 있을 경우 해당 함수는 허상이 아닌 실상이 됩니다.


  상수변수(Constant Variable): Const라는 키워드를 사용하여 변수 값을 변경할 수 없도록 합니다. 주로 에러 검출과 실수 방지를 위해 사용하며, 상수 변수가 가진 값에 영향을 미치지 않습니다.

  에러체크를 하면서 변수 값이 바뀐다면 const를 넣어 컴파일 하면서 에러검출이 가능해집니다.

//Variable.c
#include <stdio.h>

extern int e;

void Extfunc(){
    e = 76;
}
...

//Variable2.c
#include <stdio.h>

//static variable
void StaticFunc(void) {
    static int S_var = 0;
    int var = 0;
    S_var = S_var + 1;
    var = var + 1;
    printf("static variable: %d, Local variable: %d\n", S_var, var);
}

//global variable
int g;

//external variable
int e;
extern void Extfunc();


int main() {
//local variable
    int l = 3;
    {
        int l = 45;
        printf("Local variable: %d\n", l);
    }
    printf("variable l: %d\n", l);

//global variable
    printf("global variable: %d\n", g);
    g = 99;
    printf("g: %d\n", g);

//static variable
    int i;
    for(i=0;i<4;i++){
        StaticFunc();
    }

//external variable
    printf("e: %d\n", e);
    Extfunc();
    printf("external variable: %d\n", e);

    
    return 0;
}


+ Recent posts