위에서의 예시와 같이 함수의 정의는 다음과 같은 형태로 행해진다.
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
'Programming Tools > TCPL C Language' 카테고리의 다른 글
[C Language] External Variables, Automatic Variable (전역변수, 자동변수, 지역변수) (0) | 2021.06.22 |
---|---|
[C Language] Chap.4 Functions and Program Structure - Functions returning Non-Integers (0) | 2021.06.21 |
[C Language] Chap.3 Control Flow - comma `,` 연산자 (0) | 2021.06.11 |
[C Language] Chap.3 Control Flow - Goto와 Label (0) | 2021.06.11 |
[C Language] Chap.3 Control Flow - Break, Continue (0) | 2021.06.10 |