Programming Tools/TCPL C Language

[C Language] Chap.4 Functions and Program Structure

LiDARian 2021. 6. 20. 18:10
반응형

위에서의 예시와 같이 함수의 정의는 다음과 같은 형태로 행해진다.

return-type function-name(argument declarations){
    declarations and statements
}

 

function의 declaration과 definition은 서로 타입이 같아야한다.


argument 입력 시 type casting이 암시적으로 실행된다.

 

https://en.cppreference.com/w/c/language/extern
각각의 external object에 대해서 오로지 하나의 definition만 있어야한다.

 

https://stackoverflow.com/questions/17513736/what-does-it-mean-that-automatic-structures-and-arrays-may-now-also-be-initializ
C89 표준 기준으로, definition 이후에 automatic array/structure이 초기화 될 수 있다.

 

함수의 return 값 중 -1은 failure를 표기하는 일에 사용하도록 하자.


ould라는 문자열을 찾는 프로그램을 만든다고 하자.

해당 프로그램은 아래와 같은 구조를 가지게 될 것이다.

while(there's another line)
    if(the line contains the pattern)
        print it...

전체 프로그램을 작성하면

#include <stdio.h>
#define MAXLINE 1000

int getline(char line[], int max);
int strindex(char source[], char searchfor[]);

char pattern[] = "ould";

int main(){
    char line[MAXLINE];
    int found = 0;

    while(getline(line, MAXLINE) > 0)
        if(strindex(line, pattern) >= 0){
            printf("%s", line);
            found++;
            printf("%d", found);
        }
    return found;
}

// s[]로 한 줄을 입력받는다.
int getline(char s[], int lim){
    int c, i;

    i = 0;
    while(--lim > 0 && (c=getchar()) != EOF && c != '\n')
        s[i++] = c;
    if(c == '\n')
        s[i++] = c;
    s[i] - '\0';
    return i;
}

// 찾는 문자열 t[]의 인덱스를 구한다.
int strindex(char s[], char t[]){
    int i, j, k;

    for(i = 0; s[i] != '\0'; i++){
        for(j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++) ;
        if(k > 0 && t[k] == '\0')
            return i;
    }
    return -1;
}

출력 :
asdfasdferer
asdfjdo
asdfsodould
asdfsodould

1

 

최신 컴파일러에서는 허용되지 않지만, return-type이 생략됐을 경우 int로 대체한다.

 

함수간의 데이터 교환은 argument, return value, external varaible을 통해서 이루어진다.

 

return expression은 해당 함수를 호출한 함수로 반환값을 내놓는다.


반환값을 받는 함수는 그 반환값을 무시할 수 있다. 사용하지 않을 수 있다는 것이다.

return ;등의 표현을 통해서 아무 값도 반환하지 않을 수 있다.
혹은 {}의 끝 부분에 도달함으로써 함수를 그대로 종료할 수 있다.

다만, 어떨 때는 반환했다가, 어떨 때는 반환안했다가 하지 않게, 함수가 일관성 있게 값을 반환하도록 잘 설계해야만한다.

 

위의 예제에서는 main함수가 값을 운영체제에 반환하는데, 경우에 따라서는 운영체제를 통해 이 값을 이용할 수도 있다.


터미널에서 CLI 방식으로 컴파일한다면 이렇게 하면 된다.

gcc main.c getline.c strindex.c

그 결과 main.o getline.o strindex.o 파일과, a.out 파일이 생성된다.

만약 main.c만 고쳤다면 이렇게 하면된다.

gcc main.c getline.o strindex.o
반응형