제 11장 C 프로그래밍.

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
1 구조체 윤 홍 란 컴퓨터 프로그래밍 2 구조체 정의  구조체란 ? o 서로 다른 형의 변수들을 하나로 묶어주는 mechanism. (cf. 배열 : 같은 형의 변수들을 하나로 묶어주는 mechanism) o 예 : 카드의.
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
Linux/UNIX Programming
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
고급 시스템 프로그래밍 제1장 소개 창병모 숙명여대 컴퓨터과학과.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
자료 구조: Chapter 3 (2)구조체, 포인터
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
HW#1 Source 파일 제출 3.20(수)까지 제출 학번_이름_01.c
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
11 표준 입출력과 파일 입출력 데이터를 읽고 쓰는 다양한 방법 익히기!.
6장. printf와 scanf 함수에 대한 고찰
14주차.
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C#.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
Linux/UNIX Programming
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Linux/UNIX Programming
Canary value 스택 가드(Stack Guard).
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
제 6 장 함수(functions).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
어서와 C언어는 처음이지 제21장.
printf("Global Korea\n");
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

제 11장 C 프로그래밍

C 언어 개요 1972년 Denis Richi에 의해 설계됨 발달과정 특징 UNIX운영체계를 위하여 개발 algol->cpl->bcpl->b->c 특징 구조화된 언어로서 모듈별 설계가 가능하다. 이식성이 강하다.(다양한 하드웨어에서 사용 가능) 처리속도가 빠르다. 다양한 연산자(44개의 연산자) 동적이고 능동적인 메모리 관리

C 프로그램 여러 개의 .c 파일로 구성됨 하나의 .c 파일 #include #define 비지역 변수 선언들 함수들을 선언

C 프로그램 구조 #include <....> #include "...." #define  ... int function(int,long,...); int value1,  value2; void  main() {   int x; //지역변수 정의    … //함수의 내용; } int  function(...) {      ...... } #include <내장헤더파일> #include "사용자정의헤더파일“ #define ..매크로 상수/함수 정의 사용자 정의 함수 선언 비지역 변수 정의 C 프로그램의 본체 사용자 정의 함수

C 프로그램 실행 1. 원시 프로그램의 작성 일반 텍스트 파일 형태를 가짐. *.c (C-언어 source file), *.cpp(C++언어 source file), *.h(header파일) 2. 컴파일러 cc –c 확장자는 UNIX에서는 *.o Dos와 Window9* 에서는 *.obj라는 확장자를 가짐. 3.실행 프로그램 생성 cc -o 목적 프로그램을 필요한 라이브러리와 부프로그램등과 링크시켜서 실행프로그램 생성 최종 실행파일명: a.out 혹은 사용자 정의 이름  

문장 종류 공문(Empty Statement) 단순문(Simple Statement) ';'으로 되어있는 문장 단순문(Simple Statement) '식;'으로 되어있는 문장 예)        int a, b=10;    //선언문  (int a; int b; b=10;과 동일)        a = b +5;        //배정문        display(a);      //함수 호출문 복합문(Compound Statement) 하나이상의 단문들을 기술하여 {}로 둘러싼 문 전처리 지시어(Preprocessor directive) '#지시어'형태의 문, ';'를 붙이지 않음

문장의 기능별 분류 선언문(Declarative Statement) 함수 외부에서 비지역변수 선언  int a;  void f(매개변수선언){//함수내용  } 함수 서두에서 매개변수 선언   void f(int a){//함수내용} 함수 내부에서 지역변수 선언   void f(매개변수선언)   {          int a;           //함수내용    }

기능별 분류 배정문 제어문(Control Statement) 주석문(Comment) 프로그램의 제어의 흐름에 관한 문 if문, switch case문, while문, do while문, for문  break문, continue문, return문, goto문 주석문(Comment) /* 주석내용(여러줄도 가능) */ // 한줄내에서 가능(c++컴파일러에서 가능)

자료형(Data type) 기본형 문자형 정수형 실수형 나열형 void char(8bit): -128~127 unsigned char(8bit): 0~255 정수형 int, short int(16bit): -32768~32767 unsigned int(16bit): 0~65535 long(32bit): -2147483648~2147483647 unsigned long(32bit): 0~4294967295 실수형 float(32bit): ±3.4x10-38 ~ ±3.4x1038 double(64bit): ±1.7x10-308 ~±1.7x10308 long double(80bit): ±3.4x10-4932 ~ ±3.4x104932 나열형 enum(16bit): -32768 ~ 32767 void

자료형(Data type) 복합형(Complex type) 배열 포인터 구조체 공용체 데이터형 array[] 동일한 기본형의 연속배치 포인터 데이터형* 포인터변수 기억장소의 주소를 저장하는 변수 구조체 struct 구조체변수명 서로 다른 기본형의 조합 공용체 union 공용체변수명 동일한 기억장소를 분할하여 사용

표준 입출력함수 표준 입출력함수 기능 getchar() fgetc() 문자단위로 입력하는 함수 표준 입출력함수 기능 getchar() fgetc() 문자단위로 입력하는 함수 putchar() fputc() 문자단위로 출력하는 함수 gets() fgets() 문자열을 입력하는 함수 puts() fputs() 문자열을 출력하는 함수 scanf() fscanf() 형식 갖춘 자료 입력 함수 printf() fprintf() 형식 갖춘 자료 출력 함수

변환 문자의 종류 변환문자 argument 변환 방법 %d int형, char형 부호 있는 10진수로 출력한다. %ld long형 long type의 10진수로 출력한다. %u unsigned형 부호 없는 10진수로 출력한다. %x %Xint형, char형,unsigned형 16진수로 출력한다. %x는 소문자로 출력하고,%X는 대문자로 출력한다. %o int형, char형 unsigned형 8진수로 출력한다. %c int형, char형, unsigned형 주어진 argument를 ASCII Code로 보고 해당문자를 출력한다. %s 문자열의 포인터 주어진 문자열의 주소로부터 NULL문자를 만날 때 까지 기억된 문자열을 출력한다. %f float형 소수점만 가지고 있는 실수형으로 출력한다. %e , %E float형 지수형식의 실수형으로 출력한다. %g float형 %e와 %f 형식 중 자리수가 적게 드는 방식으로 출력한다. 필요 없는 0이나 소수점은 출력하지 않음 %p pointer형 어떤 기억장소의 주소를 출력시 사용한다. %Fp pointer형 어떤 기억장수의 원거리 주소를 출력시 사용한다.

C의 연산자 형명칭 연산자 결합성 1차 연산자 () [] . -> 오른쪽 형명칭 연산자 결합성 1차 연산자 ()  []  .   -> 오른쪽 단항 연산자 *  &  -  !  ~  ++  --  (형)  sizeof() 왼쪽 이항 연산자 *  /  % (곱하기, 나누기, 나머지) 오른쪽 +  -   (덧셈, 뺄셈) >>  <<   (bit shift오른쪽, 왼쪽) >  <  <=  >=   (대소의 비교) ==  != (동등비교) & (bit and) ^ (bit xor) | (bit or) && (논리 곱) || (논리 합) 삼항 연산자 ?  : 이항연산자 =  +=  -=   *=  /=  %=   &=  |= 왼쪽 ^= <<= >>=   (할당) (comma) 오른쪽

연산자 예 예1) float a, b; a=2.5*5/2;   //2.5*5.0 연산후  12.5/2.0계산됨  a=6.25 b=2.5*(5/2);   //2.5 * 2  -> 2.5 * 2.0 -> b = 5.0        //()로 인해 연산의 순서가 바뀜. // 정수/정수 => 소수점 이하는 버림. 예2) int  a[5]={10, 20, 30, 40, 50};   //[]가 배열 선언 시 사용됨 printf("\n   a[0]=%d",  a[0]);   // a[0]=10           //[]가 배열의 요소를 호출할 때 사용 예3) 구조체변수에서 변수 참조 시 사용 구조체를 가리키는 포인터변수->구조체내의 변수명  구조체변수명.이름;

&(번지 연산자) 변수의 메모리 상의 주소를 나타낼 때 사용 #include <stdio.h>  void main() {          int a=10;          printf("변수a의 값은=%d,  변수a의 주소는=%u",a, &a);   }  비교  1. &변수명 : 변수의 주소를 나타냄  2. 자료형  &변수명 : 참조 변수 선언 (기존의 변수명 대신에 사용하는 변수명)  3. 변수1  &   변수2 : Bit AND 연산자  4. 논리식1 && 논리식2 : 논리 AND 연산자

*(포인터 연산자) 선언 시: int *p; 사용 시: *p; 변수 a와 *p는 동일하게 사용 가능.

포인터 예 #include <stdio.h> void main() { int a=10;      int *p=&a; //int *p;  p=&a;두 개의 문장      printf("변수a의 주소=%u  a의 값=%d\n",  &a,  a);      printf("변수p의 값=%u  *p의 값=%u\n", p,  *p);      *p = 20; // a=20과 동일      a=30; // *p=30과 동일 }

제어 구문 선택문 if, if-else, switch 반복제어 for, while, do -while

C 프로그램 예 #include <stdio.h> void main() { int i,k; printf("정수를 입력하시오!(factorial계산)=> "); scanf("%d",&k); long fact = 1; for(i=1;i<=k;i++) fact *=i; printf("\n%d!=%ld", i, fact);" }

함수 #include <내장헤더파일> #include <stdio.h> int fn(int x); 사용자 정의 함수 선언 C 프로그램의 본체 함수 호출 사용자 정의 함수를 정의 #include <stdio.h> int fn(int x); void  main() {   int a=3, b; b=fn(a); printf(“b=%d”, b); } int fn(int x) { int y; y=x+10; return y; }

함수 호출 매개변수 전달 값 전달 (pass by value) 값 전달(pass by value)만 사용됨 실 매개변수의 값을 형식 매개변수에 전달 포인터 값을 전달할 때는 주소가 전달됨

자동 변수: 예 #include <stdio.h> void sub(); void main() { sub(); } auto int i=1; static  int j=1; printf("\n auto i=%d static j=%d", i, j); i++, j++;

정적 변수: 예 #include <stdio.h> static int i, j=4; void inc(); void main() { printf("\n1 main i=%d, j=%d", i,j); inc(); printf("\n2 main i=%d, j=%d", i, j); } void inc() ++i; printf("\nsub i=%d, j=%d", i, j); ++j;

배열 정의 static int a[10]; 동일한 형을 가지는 일련의 변수로 메모리에 연속적으로 저장된다. static : 메모리 클래스(auto, static, extern, register) int : 자료형 a : 배열명(배열의 시작주소값을 가진 상수) 10 :배열의 요소의 갯수가 10개라는 의미

배열: 예 #include <stdio.h> void main() {         int sum;         int a[3];                  a[0]=1;         a[1]=2;         a[2]=3;         int b[]={10,20,30};        for(int i=sum=0; i<=2; i++)            sum+=a[i];        printf("배열 a[]의 합=%d\n", sum);        for(int j=sum=0; j<=2; j++)           sum+=b[j];                printf("배열 b[]의 합=%d\n", sum); }

다차원 배열 다차원배열은 배열의 요소가 배열 예 다차원 배열(int a[][2])에서 배열요소 static  int  a[6][2];       int a[2]짜리 일차원 배열이 6개 연속된 배열 static int   a[2][3][4]; int a[4]짜리 일차원 배열이 3개 모인 것이 2개 있는 배열  다차원 배열(int a[][2])에서 배열요소 (예...a[0][0]...) 외에는 전부 주소값이다. a        : 배열의 시작주소 a[0]   : 첫 번째  a[2]짜리 일차원 배열 요소의 시작 주소 a[1]   :  두 번째  a[2]짜리 일차원 배열 요소의 시작주소

다차원 배열: 예 #include <stdio.h> void main() { char a[][4]={"hi","him","high"}; char b[]="hello world!"; for(int i=0;i<=2;i++) {        for(int j=0;j<=3;j++) {               if(a[i][j]==NULL)                     printf("a[%d][%d]= NULL ", i, j);               else                     printf("a[%d][%d]= %4c ", i, j, a[i][j]);        }        printf("\n"); } printf("\n"); for(int k=0; k<=12; k++) {        if(b[k]==NULL)            printf("b[%d]= NULL\n", k);        else            printf("b[%d]= %c\n", k, b[k]); } }

포인터(Pointer) 포인터 포인터 배열 배열 포인터 포인터의 포인터 기억장소(변수)에 대한 주소 값을 저장하는 주소 변수 int  *p; 포인터연산이 필요한 모든 경우 포인터 배열 포인터가 배열을 이룬 경우 int *p[10]; 길이가 서로 다른 문자열을 다룰 때 사용 배열 포인터 2차원 배열을 가리키는 포인터 int (*p)[2]; 2차원 배열을 매개변수로 넘겨주는 경우에 사용 포인터의 포인터 포인터의 대상이 포인터인 포인터 변수 int **p; 외부 매개변수를 받는 프로그램

포인터: 예 #include <stdio.h> void main() { int i; char *p, ch[]="Turbo-c"; p=ch; for(i=0; i<=6; i++)     printf("\n ch[%d] = %c", i, ch[i]); printf("\n ch[] = "); while(*p) printf("%c", *p++); }

포인터: 예 #include <stdio.h> void main() { int a=10, b=20, c=30, i, *p[3]; p[0]=&a; p[1]=&b; p[2]=&c; for(i=0; i<=2; i++)      printf("\n address = %u *p[%d] = %d", p[i], i,*p[i]); }

구조체(struct) 구조체 선언 struct 구조체_이름 {            맴버 선언문들;             .........;  }[구조체 변수_이름={초기값들,...}]; 구조체 선언 후에 구조체 변수선언 struct   구조체_이름   변수_이름;  구조체 이름(타입 이름) 정의 typedef   struct  이름 {                맴버 선언문들;                 .........;  } 구조체명;

구조체: 예 #include <stdio.h> struct   my{      int  a;      char  b;      float   c; }x={1,'a',1.5},  y={2,'b',3.5};  void main() {      struct  my  z={3,'c',3.5};      printf("\n x.a=%d x.b=%d x.c=%3.1f", x.a, x.b, x.c);      printf("\n y.a=%d y.b=%d y.c=%3.1f", y.a, y.b, y.c);      printf("\n z.a=%d z.b=%d z.c=%3.1f", z.a, z.b, z.c); }

구조체: 예 #include <stdio.h> struct  record{     char  name[10];     int age;     char  tel[13]; } man[2], *p; void main() { register  i;     for(i=0; i<2; i++ )     {         printf("이름: ");   scanf("%s", man[i].name);         printf("나이: ");   scanf("%d", &man[i].age);         printf("전화: ");   scanf("%s", man[i].tel);     }     for(i=0;i<2;i++)        printf("\n이름=%10s    나이=%3d    전화=%13s"                         ,man[i].name,  man[i].age, man[i].tel);          for(i=0, p=man; i<2; i++,p++)       printf("\n이름=%10s    나이=%3d    전화=%13s"                        ,p->name, p->age, p->tel);     for(i=0, p=man; i<2; i++,p++)       printf("\n이름=%10s    나이=%3d    전화=%13s"                       ,(*p).name, (*p).age,(*p).tel); }

자기참조 구조체:예 #include <stdio.h> typedef struct record{     char  name[10];     int  nai;     struct  record  *next } name; void main() { name a={"김 종서",35},b={"장 보고", 40}, c={"이 순신",50}, *head; a.next=&b; b.next=&c; c.next='\0'; for(head=&a; head; head=head->next) {      printf("\nPointer=%p", head);      printf("\n이름: %s, 나이: %d", head->name, head->nai);  } }

입출력 표준 입력 함수 표준 출력 함수 표준 파일 입력 함수 표준 파일 출력 함수 scanf(), getchar() printf(), putchar() 표준 파일 입력 함수 fscanf(), fgets(), fgetc() 표준 파일 출력 함수 fprintf(), fputs(),fputc()

파일 입출력 파일 입출력 과정 파일 열기 fopen() 입출력 방식 파일 열기, 읽기/쓰기, 파일 닫기 #include <stdio.h>    FILE    *fp;  fp=fopen("파일 이름", "입출력방식"); 입출력 방식 r : 읽기 전용 w: 쓰기 전용 a: 추가 수록 r+: 읽기쓰기겸용 w+: 쓰기읽기겸용 a+: 읽기추가겸용

파일 입출력 파일 입력 함수 파일 출력 함수 파일 닫기 fscanf(), fgets(), fgetc() 열린 파일에서 내용을 읽어 들이는 함수 파일 출력 함수 fprintf(), fputs(), fputc() 열린 파일에 내용을 기록하는 함수 파일 닫기 fclose()   

FILE 형 구조체 열린 파일의 상태를 저장하기 위한 구조체 형식 <stdio.h>에 정의되어 있음 typedef struct { short level;          //buffer의 상태 (fill or empty) unsigned flags;   //file상태 flags char fd;                //파일 설명자 unsigned char hold; short bsize;    //버퍼 크기 unsigned char *buffer, *curp;   //data 포인터 unsigned istemp; // 임시 파일 지시자 short token;   } FILE; 

파일 출력: 예 #include <stdio.h> #include <conio.h> void main() // 키보드에서 문자를 입력받아 파일에 출력하는 예제 #include <stdio.h> #include <conio.h> void main() {    FILE *fp;    int c;    fp = fopen("c:\\test.txt","w");  //쓰기 전용으로    c = getchar(); //키보드로부터 입력 받은 문자의 ASCII 코드 반환    while(c!=EOF)    {    //file의 끝이 아니면.                fputc(c, fp);   //fp가 가르키는 파일에 문자 c저장          c = getchar(); //키보드로부터 문자를 읽어 c에 저장    }    fclose(fp); }

파일입출력: 예 //파일(fgets.c)에서 읽어 들여 파일(test.txt)에 출력하는 함수 #include <stdio.h> void main() { FILE *fp;    FILE *fp_write;    char buffer[100];//데이터를 임시로 저장하기위한 배열    fp=fopen("fgets.c","r");    fp_write=fopen("test.txt","w");    if(fp==NULL)       printf("file not found");    /*최대 길이가 100인 문자열을 fp가 가리키는 파일에서 읽어서 buffer에 저장 후  fp_write가 가리키는 파일에 buffer 내용 기록*/    while(fgets(buffer, 100, fp)!=NULL)        fputs(buffer, fp_write);    fclose(fp); }

디버거 gdb gdb 기능 컴파일 gdb 실행파일 단일 단계 이동(single stepping) 정지점(breakpoint) 변수 접근 및 수정 함수 탐색 추적(tracing) 컴파일 cc –g 옵션을 이용하여 컴파일 gdb 실행파일 help

gdb 명령어 break [file:]function run [arglist] bt print expr c next step Set a breakpoint at [file:]function run [arglist] Start program bt Backtrace: display the program stack. print expr c Continue running program next Execute next line (after stopping); step over any function calls in the line. step Execute next line; step into any function calls in the line. quit

다중 모듈 프로그램 여러 개의 파일로 구성된 프로그램 reverse.h void reverse(); /* 선언 */ reverse.c #include <stdio.h> #include “reverse.h” void reverse(char *before, char *after) { int i, j, len; len = strlen(before); for (j = len-1, i=0; j>=0; j--, i++) after[i] = before[j]; after[len] = NULL; }

다중 모듈 프로그램 main1.c cc –c reverse.c main1.c #include <stdio.h> #include “reverse.h” main() { char str[100]; reverse(“cat”, str); printf(“reverse (\”cat\”) = %s\n”, str); reverse(“noon”, str); printf(“reverse (\”noon\”) = %s\n”, str); } cc –c reverse.c main1.c cc –o main1 reverse.o main1.o main1

The File Dependency System Make Why do we use make ? cc "reverse.c" cc -o main1 reverse.o , main1.o … to produce a new version cc -o main2 reverse.o , main2.o … to produce a new version We want to update files automatically based on dependency rules  make [ -f makefile] - updates files based on a series of dependency rules in "make file". - If no option is specified, the name "makefile" is assumed.

The File Dependency System Make make files consist of make rules targetList: dependencyList commandList - targetList : a list of target files - dependencyList : a list of files that the files in targetList depend on - commandList : a list of commands that reconstructs the target files from the dependency files.

The File Dependency System Make main1: main1.o reverse.o cc main1.o reverse.o -o main1 main1.o : main1.c reverse.h cc -c main1.c reverse.o : reverse.c reverse.h cc -c reverse.c Figure : make dependency tree main1 main1.o reverse.o main1.c reverse.h reverse.c reverse.h