7.13.2 문자열 관련 함수 string.h     [gdoc]     [smts]

 문자열은 사용빈도가 높은 편에 속하기 때문에 C언어에서는 문자열을 제어하는 많은 함수를 지원하고 있다. 이러한 문자열을 제어하는 함수는 string.h 헤더화일에 포함되어 선언되어 있다. 자주 사용되는 함수를 다음 표에 정리하였다.


[표 5.7.1] string.h함수의 자주 사용되는 표준 함수들

함수

기능

반환값

strlen(ptr)

문자열의 길이를 반환한다.

size_t

strcpy(pDest, pSrc)

문자열을 복사한다.

char *

strcat(pDest, pSrc)

문자열을 결합한다.

char *

strcmp(ptr1, ptr2)

두 문자열을 비교한다.(같다면 0을 반환)

int


 문자열의 길이를 반환하는 함수는 strlen()이다.


0507-01.c

#include <stdio.h>
#include <string.h>

int main() {
   char s[] = "ABCDE";
   int len = strlen(s);
   printf("%d", len);
}

실행 결과

5


 문자열을 복사하는 함수는 strcpy()이다. 첫 번째 포인터에 두 번째 문자열을 복사한다. strcat()함수는 두 문자열을 병합하는데 병합된 결과는 첫 번째 포인터에 저장된다.


0507-02.c

#include <stdio.h>
#include <string.h>

int main() {
   char str1[20];
   strcpy(str1, "Hello ");
       
   char str2[] = "world!";
   char str3[10];
   strcpy(str3, str2);

   strcat(str1, str3); // str1과 str3를 합해서 str1에 저장
   printf("%s", str1);
}

실행 결과

Hello world!

 문자열 간 비교를 위해서는 strcmp()함수를 이용한다. 이 함수는 두 개의 문자열을 인자로 받아서 같다면 0을 반환하고 다를 경우에는 ASCII 코드를 비교하여 -1 혹은 +1을 반환한다. 그렇지만 주로 두 문자열이 같은지 다른지를 비교할 경우가 많다.


0507-03.c

#include <stdio.h>
#include <string.h>

int main() {
   char str1[] = "abc";
   char str2[] = "bcd";
   char str3[] = "bcd";

   int ia = strcmp(str1, str2);
   int ib = strcmp(str2, str3);
   int ic = strcmp(str3, str1);

   printf("%d, %d, %d", ia, ib, ic);
}

실행 결과

-1, 0, 1


이와 같이 표준 함수를 이용하면 문자열을 손쉽게 조작할 수 있다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

4장 연습문제 풀이 동영상  (0) 2016.05.31
7.13.3 stdlib.h  (0) 2016.05.30
7.13.1 수학함수 math.h  (0) 2016.05.30
7.13 표준함수  (0) 2016.05.30
7.10 지역배열과 전역배열  (0) 2016.05.30
Posted by 살레시오
,

7.13.1 수학함수의 모임 math.h     [doc]     [smts]

 다양한 수학 함수 값을 구하기 위한 함수들이 math.h에 정의되어 있다.



함수/상수

기능

비고

double sin(double x)

sin(x)


double cos(double x)

cos(x)


double tan(double x)

tan(x)


double asin(double x)

sin-1(x)


double asin(double x)

cos-1(x)


double asin(double x)

tan-1(x)


double asin2(double y, double x)

tan-1(y/x) x가 0인 경우도 구해짐


double sinh(double x)

sinh(x)


double cosh(double x)

cosh(x)


double tanh(double x)

tanh(x)


double exp(double x)

ex


double log(double x)

ln x(= logex)


double log10(double x)

log10x


double pow(double x, double y)

xy


double sqrt(double x)

x의 제곱근(=x1/2)


double abs(double x)

x의 절대값


double floor(double x)

x보다 크지 않은 가장 큰 정수


double ceil(double x)

x보다 작지 않은 가장 큰 정수


(주의 : ANSI C에서 정의되었던 M_PI, M_E와 같은 상수들은 C99에서 삭제되었다.)


예를 들어 0~π/2 범위의 sin(x)값 테이블을 출력하는 프로그램은 다음과 같다.


0712-01.c

#include <stdio.h>
#include <math.h>
#define PI 3.14

int main() {
   for(double x=0; x<=PI/2; x+=0.01) {
       printf("sin(%.2f)=%lf\n", x, sin(x));
   }
}

실행 결과

sin(0.00)=0.000000
sin(0.01)=0.010000
sin(0.02)=0.019999
sin(1.53)=0.999168
sin(1.54)=0.999526
sin(1.55)=0.999784
sin(1.56)=0.999942

 이차 방정식의 두 근을 구하는 예제는 다음과 같다.


0712-02.c

#include <stdio.h>
#include <math.h>

int main() {
   double da, db, dc;

   printf("input a, b, c of ax^2+bx+c=0 :");
   scanf("%lf,%lf,%lf", &da,&db,&dc);
   double dd = db*db-4*da*dc; //판별식

   if (dd>0) { // 서로 다른 두 실근
       double dr1, dr2;
       dr1 = (-db+sqrt(dd))/(2*da);
       dr2 = (-db-sqrt(dd))/(2*da);
       printf("two different real roots:%lf, %lf\n", dr1, dr2);
   } else if (dd<0) { //허근
       double real, imag;
       real = -db/(2*da);
       imag = sqrt(-dd)/(2*da);
       printf("complex roots:%lf+j%lf, %lf-j%lf\n", real, imag, real, imag);
   } else { //중근
       double r = -db/(2*da);
       printf("double root:%lf\n", r);
   }
}

실행 결과

input a, b, c of ax^2+bx+c=0 :1,4,4
double root:-2.000000

이차 방정식의 근은 판별식의 조건에 따라 종류가 달라지므로 if ~ else if ~else 구문을 사용하여 각각을 처리하였다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.13.3 stdlib.h  (0) 2016.05.30
7.13.2 문자열 관련 함수 string.h  (0) 2016.05.30
7.13 표준함수  (0) 2016.05.30
7.10 지역배열과 전역배열  (0) 2016.05.30
6장 연습문제  (0) 2016.05.30
Posted by 살레시오
,

7.13 표준함수     [doc]     [smts]

 표준함수(standard function)은 그 기능과 사용법이 C 언어의 표준으로 정의되어 있으며 라이브러리로서 포함되어 사용자가 불러서 쓸 수 있는 함수를 의미한다. 이들 표준 함수에 관한 정보는 각종 헤더 화일 (header file)에 수록되어 있으며 표준 함수를 사용하려면 미리 #include문을 사용하여 해당 헤더 화일을 편입해 주어야 한다. 예를 들어 printf() 함수를 쓰려고 하면 printf()함수가 정의되어 있는 헤더파일은 <stdio.h>파일을 인클루드하면 된다.

사용 빈도가 높은 표준함수의 종류를 나열하면 다음 표와  같다. (모든 리스트는 http://en.wikipedia.org/wiki/C_standard_library 참조)


헤더파일

표준함수

설명

stdio.h

printf, scanf, putchar, getchar, puts, gets, ...

입출력에 관련된 함수

stdlib.h

atoi, itoa, qsort, random...

수치변환, 난수함수

string.h

strcat, strcmp, strcpy, ...

문자열에 관련된 함수

ctype.h

isalnum, isalpha, isdigit, ...

문자 판별, 변환 함수

math.h

sin, cos, tan, sqrt, ...

수학함수

complex.h

creal, cimag, cabs, ...

복소수 관련 함수들

stdbool.h


부울형 관련 매크로들

...




수백여 개에 달하는 표준 함수들을 이와 같이 기능이 관련된 함수끼리 묶어서 각각 원형을 선언해 놓은 것이 바로 헤더 화일이다. 사용자는 자신이 사용하고자 하는 표준 함수가 포함된 헤더 화일을 찾아 프로그램에 포함시켜주기만 하면 그 표준 함수를 사용할 수 있다. 사용하고자 하는 표준 함수가 어느 헤더 화일에 있는지는 메뉴얼을 참조하면 된다. (부록 참조)


 만약 프로그램을 작성할 때마다 모든 헤더 화일을 프로그램 선두에 편입시켜 둔다면 궂이 표준 함수를 찾을 필요가 없다고 생각할 지도 모른다. 하지만 이렇게 작성하면 몇 줄 되지도 않는 간단한 프로그램도 모든 표준 함수를 다 포함하기 때문에 컴파일에 시간이 많이 걸릴 뿐만 아니라 프로그램의 크기도 불필요하게 커지게 되므로 꼭 필요한 함수를 포함하는 헤더 파일만 포함시켜주는 것이 바람직하다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.13.2 문자열 관련 함수 string.h  (0) 2016.05.30
7.13.1 수학함수 math.h  (0) 2016.05.30
7.10 지역배열과 전역배열  (0) 2016.05.30
6장 연습문제  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
Posted by 살레시오
,

7.10 지역배열과 전역배열 (선택 가능)    [doc]    [smts]

 변수가 전역변수, 정적변수, 지역변수로 나뉘듯이 배열도 전역배열, 정적배열, 지역배열로 구분할 수 있다. 한 가지 주의할 차이점은 전역배열과 정적배열은 자동으로 초기화가 되고 지역배열은 컴파일러에 따라서 그렇지 않을 수도 있다는 점이다. 즉, 초기화되지 않은 전역/정적배열은 자동으로 0으로 초기화 되지만 지역배열은 초기화되지 않으면 쓰레기값으로 채워진다고 봐야한다.


 다음 예제를 보면 초기화하지 않은 전역배열의 모든 요소의 합은 0이지만, 초기화하지 않은 지역배열의 모든 요소의 합은 엉뚱한 값이 나옴을 확인할 수 있다. 단 첫 요소만이라도 초기화가 된 경우는 나머지 요소들은 자동으로 0으로 채워진다는 것은 전 절에서 설명한 바가 있다.


0502-01.c
#include <stdio.h>
typedef unsigned char uchar;
uchar ucaExt[10];  //전역배열
int main(void) {
   uchar uca1[10];  //지역 배열
   uchar uca2[10] = {1}; // 지역배열. 나머지는 0으로 채워진다.
   short sSum1 = 0, sSum2 = 0, sSum3=0;

   for (short sN=0; sN<10; sN++) {
       sSum1 += ucaExt[sN];
       sSum2 += uca1[sN];
       sSum3 += uca2[sN];
   }

   printf("sSum1:%d, sSum2:%d, sSum3:%d\n", sSum1, sSum2, sSum3);
}

 만약 다음처럼 전역배열이 두 가지 있다고 하자.


int iaExt1[] = {1, 2, 3, 4};
int iaExt2[5] = {1, 2, 3};

전 절에서 [..]안에 배열의 크기를 생략하면 뒤의 초기화 값의 개수에 따라 배열의 크기가 결정된다고 설명한 바 있다. 따라서 iaExt1의 배열의 크기는 4가 되지만 iaExt2의 크기는 5라고 못 박았기 때문에 초기값이 지정되지 않은 4번째와 5번째 요소는 0으로 초기화된다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.13.1 수학함수 math.h  (0) 2016.05.30
7.13 표준함수  (0) 2016.05.30
6장 연습문제  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
8.6 구조체 포인터 변수  (0) 2016.04.15
Posted by 살레시오
,

6장 연습문제

pb06-01  포인터란 무엇인지 간략히 기술하라.


pb06-02  배열명은 포인터 변수이다. 일반적인 포인터 변수와 배열명의 차이점에 대해서 기술하라.


pb06-03  주어진 문자열의 길이를 구하는 프로그램을 작성하라.


pb06-04  문자열에 포함된 소문자를 전부 대문자로 바꾸는 프로그램을 작성하라.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.13 표준함수  (0) 2016.05.30
7.10 지역배열과 전역배열  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
8.6 구조체 포인터 변수  (0) 2016.04.15
8.5 구조체 배열  (0) 2016.04.15
Posted by 살레시오
,


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.10 지역배열과 전역배열  (0) 2016.05.30
6장 연습문제  (0) 2016.05.30
8.6 구조체 포인터 변수  (0) 2016.04.15
8.5 구조체 배열  (0) 2016.04.15
8.4 구조체를 필드로 가지는 구조체  (0) 2016.04.15
Posted by 살레시오
,

8.6 구조체 포인터 변수     [gdoc]     [smts]

 구조체 변수도 포인터로 선언할 수 있으며 문법은 기본 자료형의 경우와 동일하다.


Point *pa;

이렇게 선언하면 pa는 Point 구조체 포인터 변수이다. 구조체 포인터는 미리 정의된 Point 변수를 이용하여 초기화할 수 있다.


Point a = {0, 1};
Point *pa = &a;

또는 malloc()함수를 이용하여 메모리를 할당할 수도 있다.


Point *pa = malloc(sizeof(Point);


포인터 변수의 경우 필드는 다음과 같이 ‘->’ 연산자를 사용하여 접근할 수 있다.


pa->x = 0;
pa->y = 1;

즉, 구조체 포인터의 접근자는 점(.)이 아니라 ‘->’ 이다.


0806-01.c

#include <stdio.h>
#include <stdlib.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point a = {11,12};
   Point *pa = &a;
   
   pa->x = 11.5;
   pa->y = 12.6;
   
   Point *pb = malloc(sizeof(Point));
   pb->x = 13;
   pb->y = 14;
   
   printf("a.x=%lf, a.y=%lf\n", a.x, a.y);
   printf("pa->x=%lf, pa->y=%lf\n", pa->x, pa->y);
   printf("pb->x=%lf, pb->y=%lf\n", pb->x, pb->y);
   
   free(pb);
}

a.x=11.500000, a.y=12.600000
pa->x=11.500000, pa->y=12.600000
pb->x=13.000000, pb->y=14.000000

이 예에서 pa는 a로 초기화 시켰다. 따라서 pa->x 와 pa->y 는 a.x와 a.y는 서로 동일한 데이터이며 한 쪽을 변경하면 다른 쪽도 자동으로 변경된다. 그리고 pb는 별도의 메모리를 malloc() 함수를 이용하여  할당시켰다. 이 경우 반드시 free()함수를 이용하여 사용한 메모리를 반환해야 한다.


 함수로 구조체 변수를 넘길 때 복사본이 넘어가는 것은 기본 자료형과 같다. 따라서 어떤 함수에서 넘겨받은 구조체 변수의 필드를 변경하는 것은 원래 변수에 아무런 영향을 미치지 않는다.


0806-02.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

void showInfo(Point a) {
printf("(%f, %f)", a.x, a.y);
}

void changeToOrigin(Point a) {
a.x = 0;
a.y = 0;
}

int main(int argc, char **argv) {
Point a = {11,12};
printf("a:(%.2f, %.2f)\n", a.x, a.y);
changeToOrigin(a);
printf("a:(%.2f, %.2f)\n", a.x, a.y);
}

실행 결과

a:(11.00, 12.00)
a:(11.00, 12.00)

위 예에서 changeToOrigin()함수를 호출할 때 Point 변수 a를 넘기고 이것이 함수 내부에서 원점으로 변경되었지만 원래 변수에는 전혀 영향을 미치지 않느다. 왜냐면 구조체 변수의 복사본이 함수로 넘어가기 때문이다.


 하지만 함수로 포인터를 넘기면 원래 구조체 필드를 직접 접근할 수 있다.


0806-03.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

void showInfo(Point a) {
printf("(%f, %f)", a.x, a.y);
}

void changeToOrigin(Point *a) {
a->x = 0;
a->y = 0;
}

int main(int argc, char **argv) {
Point a = {11,12};
printf("a:(%.2f, %.2f)\n", a.x, a.y);
changeToOrigin(&a); //<- 포인터를 넘긴다.
printf("a:(%.2f, %.2f)\n", a.x, a.y);
}

실행 결과

a:(11.00, 12.00)
a:(0.00, 0.00)

위에서는 changeToOrigin()함수가 Point형 포인터를 받아서 필드를 변경한다. 호출하는 쪽에서도 a변수의 포인터(&a)를 넘겨준다. 이러면 changeToOrigin()함수 내부에서 원본을 변경할 수 있다. 실행 결과에서 보면 변수 a의 필드들이 변경되었음을 알 수 있다.

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

6장 연습문제  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
8.5 구조체 배열  (0) 2016.04.15
8.4 구조체를 필드로 가지는 구조체  (0) 2016.04.15
8.3 구조체를 함수의 인자로 넘기기  (0) 2016.04.15
Posted by 살레시오
,

8.5 구조체 배열     [gdoc]     [smts]

 기본 자료형과 마찬가지로 구조체 변수도 배열을 형성할 수 있다. 예를 들어 Point 형 변수 세 개를 배열로 생성하고 싶다면 다음과 같이 하면 된다.


Point pa[3];

이렇게 하면 크기가 3인 Point형 배열 변수 pa가 생성된다. 초기화 방법은 배열의 초기화와 동일하다.


Point p0 = {0,0};
Point p1 = {1,1};
Point p2 = {2,2};
Point pa[3] = {p0, p1, p2};

또는 다음과 같이 바로 초기화를 할 수도 있다.


Point pa[3] = {{0,0}, {1,1}, {2,2}};

배열 각 요소를 통하여 구조체의 필드를 접근할 수 있다.


Point pa[3];
pa[0].x = 0;
pa[0].y = 0;
pa[1].x = 1;
pa[1].y = 1;
pa[2].x = 2;
pa[2].y = 2;

동일한 방법으로 초기화 이후에도 각 필드의 값을 자유롭게 접근하여 읽거나 변경할 수 있다.


 배열의 크기가 커지면 반복문을 이용하여 구조체 필드를 초기화하는 것이 일반적이다. 예를 들면 다음과 같다.


ex08-09.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point pta[100];
for (int k=0; k<100; k++) {
pta[k].x = 1;
pta[k].y = 1;
}
}

또는 미리 정의된 Point형 변수를 이용할 수도 있다.


ex08-09.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point pt = {1,1};
Point pta[100];
     // 100개의 요소를 pt로 초기화시킨다.
for (int k=0; k<100; k++) {
pta[k] = pt;
}
}

이와 같이 구조체도 배열을 생성하여 사용할 수 있다.


Posted by 살레시오
,

8.4 구조체를 필드로 가지는 구조체     [gdoc]     [smts]

 어떤 구조체의 필드가 다른 구조체의 변수가 될 수도 있다. 직사각형의 정보를 갖는 Rect라는 구조체를 작성해 보자. 이 구조체는 마주보는 두 꼭지점의 의 좌표를 가지고 있어야 한다.


typedef struct {
double x;
double y;
} Point;

typedef struct {
Point leftTop;
Point rightBot;
} Rect;

여기에서 보면 Rect 구조체는 두 개의 Point 구조체 변수를 가지고 있다. 이런 식으로 구조체의 필드가 다른 구조체의 변수가 될 수 있다.


 구조체 Rect를 초기화 시키는 방법은 다음과 같이 몇 가지 방법이 있다.


// 초기화 방법 1 : 모든 구조체 변수를 생성과 동시에 초기화함
Rect ra = {{0, 1}, {11, 12}};
// 초기화 방법 2 : 이미 정의된 Point 변수 이용
Point p1 = {0, 1}, p2 = {11, 12};
Rect rb = {p1, p2};
// 초기화 방법 3: 선언 후 각각의 필드에 초기값 대입
Rect rc;
rc.leftTop.x = 0;
rc.leftTop.y = 1;
rc.rightBot.x = 11;
rc.rightBot.y = 12;

이제 사각형의 면적을 구하는 함수를 추가한 전체 소스 코드는 다음과 같다.


ex08-08.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

typedef struct {
Point leftTop;
Point rightBot;
} Rect;

double calcArea(Rect);

int main(int argc, char **argv) {
// 초기화 방법 1 : 모든 구조체 변수를 생성과 동시에 초기화함
Rect ra = {{0, 1}, {11, 12}};
// 초기화 방법 2 : 기정의 된 Point 변수 이용
Point p1 = {0,1}, p2 = {11, 12};
Rect rb = {p1, p2};
// 초기화 방법 3: 선언 후 각각의 필드에 초기값 대입
Rect rc;
rc.leftTop.x = 0;
rc.leftTop.y = 1;
rc.rightBot.x = 11;
rc.rightBot.y = 12;
printf("area of ra : %f\n", calcArea(ra));
printf("area of rb : %f\n", calcArea(rb));
printf("area of rc : %f\n", calcArea(rc));
}

double calcArea(Rect r) {
double dx = r.rightBot.x - r.leftTop.x;
double dy = r.rightBot.y - r.leftTop.y;
return dx*dy;
}

실행 결과

area of ra : 121.000000
area of rb : 121.000000
area of rc : 121.000000

이와 같이 구조체의 필드로 다른 구조체 변수도 얼마든지 사용할 수 있다. 다만 구조체를 정의하는 순서에 유의하면 된다. 당연한 얘기지만 Rect 구조체가 Point 구조체 뒤에 와야 한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

8.6 구조체 포인터 변수  (0) 2016.04.15
8.5 구조체 배열  (0) 2016.04.15
8.3 구조체를 함수의 인자로 넘기기  (0) 2016.04.15
8.2 구조체 필드의 초기화  (0) 2016.04.15
8.1 구조체의 정의  (0) 2016.04.15
Posted by 살레시오
,

8.3 구조체를 함수의 인자로 넘기기     [gdoc]     [smts]

 구조체는 정의되면 새로운 자료형처럼 사용할 수 있으며 기본 자료형을 함수에 넘기는 것과 동일한 방법으로 구조체 변수도 사용할 수 있다. 전 절에서 예로 든 Point 구조체를 예로 들어서 두 점간의 거리를 구하는 함수를 작성해 보자. 함수의 이름은 getDist()라고 하고 Point 구조체 변수 두 개를 받아서 double형 값(거리)를 반환해야 한다. 함수 본체는 다음과 같이 작성할 수 있다.


double getDist(Point a, Point b) {
double dx = b.x - a.x;
double dy = b.y - a.y;
double dist = sqrt(dx*dx + dy*dy);
return dist;
}

여기서 함수 헤더를 보면 기본 자료형의 경우와 동일한 방법으로 포인터 변수를 받음을 알 수 있다. 지역변수 a와 b는 Point형 변수이므로 Point구조체의 필드를 사용할 수 있다.


 두 점의 거리를 구하는 전체 프로그램은 다음과 같다.


ex08-06.c

#include <stdio.h>
#include <math.h>

typedef struct {
double x;
double y;
} Point;

double getDist(Point a, Point b);

int main(int argc, char **argv) {
Point a = {1.1, 2.2};
Point b = {3.3, 4.4};

double dist = getDist(a, b); //함수 호출
printf("a = {%f, %f}\n", a.x, a.y);
printf("b = {%f, %f}\n", b.x, b.y);
printf("dist = %f\n", dist);
}

double getDist(Point a, Point b) {
double dx = b.x - a.x;
double dy = b.y - a.y;
double dist = sqrt(dx*dx + dy*dy);
return dist;
}

실행 결과

a = {1.100000, 2.200000}
b = {3.300000, 4.400000}
dist = 3.111270

함수 getDist() 내에서 수학함수 sqrt()를 사용하기 위해서 math.h를 인클루드 시켰다.


 이와 같이 구조체를 정의하는 것은 새로운 자료형을 만드는 것과 같다. 구조체가 한 번 정의되면 기본 자료형과 동일한 방법으로 변수를 생성할 수 있고 함수의 인자로 넘길 수 있으며 함수의 반환값이 될 수도 있다. 예를 들어서 두 점의 좌표를 받아서 Point형 변수를 반환하는 간단한 함수를 작성해 보자.


ex08-07.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

Point getPoint(double, double); //← (1)

int main(int argc, char **argv) {
Point a = getPoint(0,0);
Point b = getPoint(1,1);
printf("a = {%f, %f}\n", a.x, a.y);
printf("b = {%f, %f}\n", b.x, b.y);
}

Point getPoint(double x, double y) {
Point a = {x, y};
return a;
}

실행 결과

a = {0.000000, 0.000000}
b = {1.000000, 1.000000}

이 예에서 getPoint()함수는 Point형 변수를 반환한다. 따라서 함수를 선언할 때 반환형을 (1)과 같이 명시해야 한다. 그리고 함수 내부에서는 Point형 변수를 return해야 한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

8.5 구조체 배열  (0) 2016.04.15
8.4 구조체를 필드로 가지는 구조체  (0) 2016.04.15
8.2 구조체 필드의 초기화  (0) 2016.04.15
8.1 구조체의 정의  (0) 2016.04.15
6.5 문자열과 포인터  (0) 2016.04.15
Posted by 살레시오
,