MySQL Monitor


Database Client 프로그램 중 하나로 MySQL서버의 번들로 제공하는 기본 프로그램



1. 사용법


1
mysql -u아이디 -p비밀번호 
cs



2. 데이터베이스 생성


1
CREATE DATABASE music CHARACTER SET utf8 COLLATE utf8_general_ci;
cs



3. 테이블 생성


1
2
3
4
5
6
CREATE TABLE `favorite_music` (
  `title` varchar(255NOT NULL,
  `musician` varchar(20NOT NULL,
  `duration` varchar(20NOT NULL,
  `album` varchar(30NOT NULL
ENGINE=innodb;
cs




4. 테이블에 데이터 추가


1
insert into favorite_music (`title`,`musician``duration``album`values('Chasing Pavements''아델''3:30'19);
cs




5. 데이터 조회

1
select * from favorite_music;
cs




6. 종료

1
exit;
cs





'Programming > DataBase' 카테고리의 다른 글

SQL - 테이블(2)  (0) 2018.03.21
SQL - 테이블(1)  (0) 2018.03.21
SQL - 데이터베이스  (0) 2018.03.21
Wiindows MySQL 설치  (0) 2018.03.21
데이터베이스란  (0) 2018.03.20

MySQL 설치




  • APM이란?
    Apache + PHP + MySQL을 한번에 설치해주는 웹서버 프로그램


  • 설치방법
    생활코딩 참고(
    https://opentutorials.org/course/195/1464)

  • 설치완료 화면







'Programming > DataBase' 카테고리의 다른 글

SQL - 테이블(2)  (0) 2018.03.21
SQL - 테이블(1)  (0) 2018.03.21
SQL - 데이터베이스  (0) 2018.03.21
MySQL Monitor  (0) 2018.03.21
데이터베이스란  (0) 2018.03.20

1. 데이터베이스란

  • 정보를 저장하는 애플리케이션으로 데이터를 파일에 저장하는 방법의 한계점을 보완하고자 만들어짐
  • 데이터 저장소



2. 데이터베이스 종류

 용어

의미 

Database Server 

 클라이언트/서버 컴퓨터 운용에서 데이터베이스 처리를 위한 서버

 Database

 여러 사람에 의해 공유되어 사용될 목적으로 통합하여 관리되는 데이터의 집합

 Table

 세로줄과 가로줄의 모델을 이용하여 정렬된 데이터의 집합

 Row

 레코드 및 튜플이라고 불리며, 어떤 테이블에서 단일 구조의 데이터 항목

 Column

 특정한 단순 자료형의 데이터값과 테이블에서의 각 열

 Field

 같은 종류의 의미를 갖는 데이터들을 저장하기위한 항목

 Database Client

 Database Server가 제공하는 기능들을 핸들링하는 프로그램

(예시 : mysql monitor, phpmyadmin, navicat, mysql query browser)









'Programming > DataBase' 카테고리의 다른 글

SQL - 테이블(2)  (0) 2018.03.21
SQL - 테이블(1)  (0) 2018.03.21
SQL - 데이터베이스  (0) 2018.03.21
MySQL Monitor  (0) 2018.03.21
Wiindows MySQL 설치  (0) 2018.03.21


ZZUYONI(ㆁᴗㆁ✿)

instagram @_juyeon_zzang_



소속

대학정보보호동아리연합회 KUCIS 서경강권역 운영진 (2017.05~2017.12)

차세대 보안리더 양성 프로그램 BoB(Best of the Best) 5기 보안컨설팅트랙 (2016.07~2017.03)

융합보안연구회 CSS(Convergence Security Study) 소속 (2014.03~)

서울과학기술대학교 글로벌융합산업공학과 산업정보시스템전공 (2014.03~)



경력

한국정보보호학회 동계학술대회 논문 구두발표 (2017.12)

NH농협 농업핀테크아이디어톤 본선 진출 (2017.11)

(주)PCN 보안사업부 전임컨설턴트 (2017.06~2017.08)

KISA 주관 SW 개발보안경진대회 본선 진출 (2017.10)

KISA 주관 SW 개발보안경진대회 본선 진출 (2016.08)

한국통신인터넷기술 KAITS 보안관제사업본부 인턴 (2016.02~2016.06)

한국정보보호학회 동계학술대회 논문 구두발표 (2015.12)

(사)한국산학연협회 개발 보조연구원 (2014.11~2015.09)



수상실적

빗썸 핀테크 아이디어&사업공모전 아이디어부문 장려상 (2018.03)

대학정보보호동아리연합회 KUCIS 우수동아리 선정 - 최우수상 (2017.12)

한국인터넷진흥원 공로상 (2017.12)

서울과학기술대학교 글로벌융합산업공학과 졸업논문/작품 금상 (2017.11)

서울과학기술대학교 글로벌융합산업공학과 아이디어 공모전 및 홈페이지 제작 공모전 동상 (2016.01)








"빗썸, '핀테크 아이디어·사업 공모전' 시상식 가져", 전자신문, 2018.03.08

"실전형 보안인재의 보고, ‘2017년 대학정보보호동아리(KUCIS)’ 첫 발 내딛다", 보안뉴스, 2017.04.28

"정보보안업계의 미래를 꿈꾸다! 서울과학기술대학교 동아리 CSS", 삼성반도체이야기, 2017.04.10

"미래 보안 책임질 차세대 보안더 5기 인증식 열려", 보안뉴스, 2017.03.30

level8에서 얻은 ID, PW로 접속한다.

 

힌트를 읽었더니 이러한 코드가 나왔다.

buffer overflow를 이용하여 풀어야하는 문제인 것 같다.

buf2, buf 순서대로 변수가 선언되었으므로 스택에 아래처럼 저장된 것을 알 수 있다.

 buf2

 buf

buf의 메모리가 주어진 값보다 더 들어가게 될 경우 buf2의 메모리를 건드릴 수 있다.

 

메모리 할당은 8의 배수로 할당되기 때문에 아래 그림처럼 메모리가 할당된다.

   ┌-------------------    buf2   -------------------┐┌-------------------    buf   -------------------┐

 X

 X

 X

 X

 X

 X

 

 

 

 

 

 

 

 

 

 

 X

 X

 X

 X 

 X

 X

 

 

 

 

 

 

 

 

 

 

X부분은 사용하지 않는 구간이다.

 

주어진 코드를 해석하면 buf2의 첫 두자리가 go인 경우 level10의 권한으로 쉘이 실행된다.

따라서 데이터를 아래와 같이 입력한다.

   ┌-------------------    buf2   -------------------┐┌---------------------    buf   -----------------┐

 X

 X

 X

 X

 X

 X

 

 

 

 

 

 

 

 

 o

 g

 6

 5

 4

 3

 2

 1

 0

 9

 8

 7

 6

 5

 4

 3

 2

 1

즉, 앞 16자리는 아무 문자나 적어주고 그다음 두자리에 go를 적어주면 된다.

 

 

이렇게 입력한다. 그리고 my-pass를 입력해주면 패스워드를 얻을 수 있다.

 

 

'Challenge > FTZ' 카테고리의 다른 글

level8  (0) 2016.01.20
level7  (0) 2016.01.20
level6  (0) 2016.01.20
level4  (0) 2015.06.25
level3  (0) 2015.06.25

 level7에서 얻은 ID,PW로 접속한다.

 

힌트를 확인하면 shadow파일의 용량이 2700이라는 것을 알 수 있다.

find명령어를 통해 용량이 2700인 파일들을 찾아내면 된다.

하지만 용량의 단위를 모르므로 b, c, k, w를 모두 해본다.

 

 

용량이 2700c일 때  /etc/rc.d/found.txt라는 파일이 뜬다.

 

 

이 파일을 읽어보면 위와 같이 뜨게 된다.

$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps 이부분이 암호인데 MD5로 암호화 되어있다.

이를 복호화 하기위해 shadow암호를 복호화 시키는 "John the Ripper"프로그램을 설치하여 사용한다.

httpwww.openwall.comjohn

 

 

설치된 폴더 내에 run폴더 밑에 level9:$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.:11040:0:99999:7:-1:-1:134549524 를 저장한 텍스트파일을 넣어준다.(이름을 txt.txt로 함)

 

cmd창을 켜서 텍스트파일이 저장되어 있는 폴더로 들어가

john --show (파일명.txt)를 입력하면

level9:apple:11040:0:99999:7:-1:-1:134549524로 복호화 된 것을 볼 수있다.

따라서 비밀번호는 apple이다.

'Challenge > FTZ' 카테고리의 다른 글

level9  (0) 2016.01.20
level7  (0) 2016.01.20
level6  (0) 2016.01.20
level4  (0) 2015.06.25
level3  (0) 2015.06.25

level6에서 얻은 ID, PW로 접속한다.

 

힌트에서 /bin/level7을 실행하라 했으므로 실행히킨다. 이때 패스워드는 가까운 곳에 있다 했으므로 level7의 비밀번호를 입력해준다.

 

 

입력하면 _-이런 문구가 뜨는데 _은 0, -는 1로 해석하면 아래처럼 나온다.

01101101 01100001 01110100 01100101

 

이 것을 10진수로 바꾸면
109  97   116    101

이다. 아스키코드로 해석을 하면

mate

라는 문자를 얻을 수 있다.

 

 

다시 /bin/level7을 실행시킨 후 mate를 입력하면 level8의 패스워드를 알 수 있다.

'Challenge > FTZ' 카테고리의 다른 글

level9  (0) 2016.01.20
level8  (0) 2016.01.20
level6  (0) 2016.01.20
level4  (0) 2015.06.25
level3  (0) 2015.06.25

 level5에서 구한 ID, PW를 가지고 접속한다.

 

접속하면 힌트가 뜨는데 이때 아무키나 누르게 되면 아래 화면이 뜹니다.

 

 

이대 접속하고 싶은 bbs를 선택한 후 기다리면 연결이 끊겨 다른 명령어를 입력할 수 없게 됩니다.

 

 

 

따라서 재접속 후 ctrl+c를 눌러 프로그램을 종료시킨 뒤 ls를 통해 파일들을 확인합니다.

 

 

password라는 파이을 읽어주면 level7의 비밀번호를 얻을 수 있습니다.

'Challenge > FTZ' 카테고리의 다른 글

level8  (0) 2016.01.20
level7  (0) 2016.01.20
level4  (0) 2015.06.25
level3  (0) 2015.06.25
level2  (0) 2015.06.25

구조체

 

 

구조체의 형 선언과 멤버 참조

 

- 구조체는 배열처럼 여러 개의 변수를 묶어서 처리할 수 있는 방법을 제공

 

- 배열과 차이점은 다른 형태의 자료형도 함께 묶을 수 있다는 것이다

 

- struct예약어를 사용하여 구조체의 형태를 만든다

ex)

struct student{

int num;

double grade;

};    //세미콜론 꼭 붙여줘야 함

 

- 구조체 내의 멤버 참조 시 미리 선언해주어야 함

ex) struct student s;

 

- 구조체 내의 멤버들은 기억공간을 할당받지 않는다.

 

- 구조체는 사용자가 임의로 정의한 자료형

 

- 구조체 변수의 각 멤버를 참조하기 위해서 멤버참조 연산자 (.)을 사용

ex)

s.num=12;

s.grade=4.0;

 

예제 17-1) 구조체의 형 선언과 멤버 참조

과자 바사삭의 가격과 열량을 저장할 cracker구조체를 선언 후 가격과 열량을 키보드로 입력받아 화면에 출력

#include <stdio.h>

int main(){
 struct cracker{
  int price;
  int cal;
 };
 
 struct cracker c;
 printf("바사삭의 가격과 열량을 입력하세요 : ");
 scanf("%d %d", &c.price, &c.cal);
 
 printf("바사삭의 가격 : %d원", c.price);
 printf("바사삭의 열량 : %dkcal", c.cal);
 
 return 0;
}

결과

 

 

- 구조체의 멤버로 포인터 변수도 사용 가능하다.

 

- 포인터 변수를 멤버로 사용하는 경우 문자열을 간단히 연결할 수 있다.

 

- 하지만 문자열 저장을 위한 기억공간이 존재하지 않으므로 키보드로부터 새로운 문자열의 입력이 불가능하다.

 

- 구조체의 멤버로 다른 구조체를 사용할 수 있다.

ex)

struct profile{

int age;

double height;

char* np;

}

struct student{

struct profile pf;

int num;

int grade;

}

 

- 위의 경우 멤버참조를 두번하면 된다.

ex) s.pf.age=21;

 

예제17-2) 구조체 멤버의 참조

구조체의 포인터 멤버를 참조하여 키보드로부터 데이터를 입력받아 프로그램 실행하기

#include <stdio.h>
#include <stdlib.h>
struct profile{
 int age;
 double height;
 char* np;
};

struct student{
 struct profile pf;
 int num;
 double grade;
};

int main(){
 struct student s1;
 
 printf("나이를 입력하세요 : ");
 scanf("%d", &s1.pf.age);
 
 printf("키를 입력하세요 : ");
 scanf("%d", &s1.pf.height);
 
 s1.pf.np = (char*)malloc(sizeof(char));    //구조체의 포인터변수 멤버에 값을 입력하기 위해 동적할당을 해준다
 printf("이름을 입력하세요 : ");
 scanf("%s", s1.pf.np);
 
 s1.num=5;
 s1.grade=4.4;
 
 
 printf("이름 : %s\n", s1.pf.np);
 printf("나이 : %d\n", s1.pf.age);
 printf(" 키  : %d\n", s1.pf.height);
 printf("학번 : %d\n", s1.num);
 printf("학점 : %.1lf\n", s1.grade);
 
 return 0;
}

결과

 

 

- 구조체 변수를 선언하면 외부변수가 되므로 초기화를 해주지 않으면 모든 기억공간이 0으로 채워진다.

 

- 구조체 변수를 함수의 전달인자로 사용할 수 있다.

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

struct student{
 int age;
};

struct student add(struct student);

int main(){
 
 struct student s1;
 s1.age = 21;
 printf("나이 : %d\n",s1.age);


 s1 = add(s1);    //함수 호출
 printf("나이 : %d", s1.age); 

 

 return 0;
}

struct student add(struct student s2){
 int a = 21;
 s2.age = a + 10;
 return s2;
}

결과

 

 

예제 17-3)구조체 변수를 전달인자로 받고 리턴하는 함수

student구조체 선언 후 평균 빼고 모두 초기화 해준다.

평균을 구하고 초기값을 리턴해주는 함수를 만든다.

메인함수에서 평균을 참조하여 출력한다.

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

struct student{
 int num;
 char name[20];
 int score[5];
 double avg;
};

struct student average(struct student);

int main(){
 struct student s = {14113346, "이주연", {90, 95, 100, 90, 100}};
 
 s = average(s);
 
 printf("평균 : %.1lf", s.avg);
 
 return 0;
}
 
struct student average(struct student s){
 double average=0;
 
 printf("학번 : %d\n", s.num);
 printf("이름 : %s\n", s.name);
 printf("점수 : ");
 for(int i=0;i<5;i++){
  printf("%d\t", s.score[i]);
   average += s.score[i];
 }
 s.avg = average/5.0;
 printf("\n");

 return s;
}

결과

 

 

 

구조체 배열

 

- 같은 형태의 구조체변수가 많이 필요할 경우 배열을 선언하여 사용할 수 있다.

ex)

구조체:

struct adress{

char name[20];

int age;

char tel[20];

char addr[80];

}

메인에서 구조체배열 선언&초기화:

struct adress list[5] = { {"이름1", 나이1, "전화번호1", "주소1"},

    {"이름2", 나이2, "전화번호2", "주소2"},

    {"이름3", 나이3, "전화번호3", "주소3"},

    {"이름4", 나이4, "전화번호4", "주소4"},

    {"이름5", 나이5, "전화번호5", "주소5"}};

 

#include <stdio.h>

struct address{
 char name[20];
 int age;
 char tel[20];
 char addr[80];
};

int main(){
 struct address list[3]={{"이주연", 21, "010-1234-5678", "서울" },
       {"지한별", 21, "010-9876-5432", "대전"},
       {"홍서우", 21, "010-1111-2222", "서울" }};
 
 for(int i=0;i<3;i++){
  printf("%10s%5d%15s%20s\n", list[i].name, list[i].age, list[i].tel, list[i].addr);
 }
 return 0;
}

결과

 

 

 

구조체 포인터

 

- 구조체 전체를 가리키는 포인터

ex)

struct score{

int kor, eng, mat;

}

메인:

struct score a = {70, 90, 100};

struct score* sp = &a;

 

- 멤버참조 : (*sp).kor 또는 sp->kor

 

예제 17-4)구조체배열을 처리하는 함수

이름, 학점, 영어점수를 입력하여 엘리트의 데이터를 출력하는 프로그램

구조체 배열을 사용하여 키보드로부터 데이터를 입력받는다

엘리트는 학점 4.0이상 영어점수 900점 이상

#include <stdio.h>

struct profile{
 char name[20];
 double grade;
 int english;
};

void input_data(struct profile *);
void elite(struct profile *);

int main(){
 
 struct profile new_staff[5];
 
 input_data(new_staff);
 
 elite(new_staff);
 
 return 0;
}

void input_data(struct profile *pf){
 printf("이름, 학점, 영어점수\n");
 for(int i=0;i<5;i++){
  scanf("%s%lf%d", (pf+i) -> name, &(pf+i) -> grade, &(pf+i) ->english);
 }printf("\n");
}

void elite(struct profile *pf){
 for(int i=0;i<5;i++){
  if((pf+i)->grade >= 4.0 && (pf+i)->english >= 900){
   printf("이름 : %s, 학점 : %.1lf, 영어점수 : %d\n", (pf+i)->name, (pf+i)->grade, (pf+i)->english);
  }
 }
}

결과

 

 

 

 

공용체

 

- 공용체는 멤버들이 모두 같은 기억공간을 사용한다.

 

- 예약어 union사용

ex)union student{

int num;

double grade;

}

 

- 구조체와 비슷한 형태이다

 

#include <stdio.h>

union student{
 int num;
 double grade;
};
int main(){
 union student s = {315};
 
 printf("학번 : %d\n", s.num);
 s.grade = 2.1;
 printf("학점 : %lf\n", s.grade);
 printf("학번 : %d", s.num);
 
 return 0;
}

 

결과

 

학점에 데이터를 입력하여 학번의 데이터가 사라졌음을 알 수 있다.

 

 

열거형

 

- 기억공간에 저장될 데이터의 집합

 

- 예약어 enum사용

ex)enum seoson{spring, summer, fall, winter};

 

- 열거형 선언시 컴파일러는 실제로 멤버들을 정수형, 상수형으로 취급

#include <stdio.h>

enum season {spring, summer, fall, winter};    //열거형 사용

int main(){
 enum season ss;
 
 char* cp;
 int select;
 
 printf("계절을 선택하세요\n1.spring 2.summer 3.fall 4.winter\n");
 scanf("%d", &select);
 
 if(select==1) {ss = spring;}
 else if(select == 2){ss=summer;}
 else if(select == 3){ss=fall;}
 else if(select == 4){ss=winter;}
 else{printf("잘못된 번호입니다.");}
 
 switch(ss){
  case spring:
   cp = "inline"; break;
  case summer:
   cp = "swimming"; break;
  case fall:
   cp = "trip"; break;
  case winter:
   cp = "skiing"; break;
 }
 printf("나의 레저활동은 %s\n", cp);
 return 0;
 
}

결과

 

 

 

typedef를 사용한 형 재정의

 

- 자료형의 이름을 재정의하여 프로그램을 간결하게 작성할 수 있다.

#include <stdio.h>

 typedef struct{
 int num;
 double grade;
}Student;

void data_prn(Student *);
int main(){
 Student s={14113346, 4.5};    //재정의 사용
 
 data_prn(&s);
 
 return 0;
 
}
void data_prn(Student* sp){
 printf("학번 : %d\n", sp->num);
 printf("학점 : %.1lf\n", sp->grade);
}

결과

 

 

 

'Programming > C' 카테고리의 다른 글

C언어 정리(8)  (0) 2015.08.09
C언어 정리(7)  (0) 2015.08.07
C언어 정리(6)  (0) 2015.08.06
C언어 정리(5)  (0) 2015.07.20
C언어 정리(4)  (0) 2015.07.20

메모리 동적 할당

 

 

동적 할당 함수

 

- 정적 할당 : 프로그램 작성 시 필요한 기억공간의 크기를 결정하는것

 

- 동적 할당 : 메모리 낭비의 최소화를 위해 입력되는 데이터에 맞게 기억공간을 할당하는 것

 

- 동적할당을 하기 위해 malloc함수 사용(stdlib.h 헤더파일에 존재)

ex)

int* ip;

ip = (int*)malloc(sizeof(int));    //기억공간을 동적으로 할당받아 포인터 변수에 연결

 

- 프로그램 실행 시 메모리의 일정한 영역인 기억부류는 4가지가 있다.

     코드영역        :    실행 파일을 위한 영역

        스택           :    자동 변수 영역

기타 데이터 영역  :    외부 변수, 정적 변수 영역

          힙            :    동적 할당 메모리 영역

 

- 자동변수의 경우 함수가 리턴되면서 자동으로 기억공간을 회수하지만 동적할당은 그렇지 않다.

  따라서 특정 함수에 구속받지 않고 위치값만 알면 어디서나 참조가 가능하다.

  만약 동적할당된 메모리를 반납하려 한다면 free함수 사용한다.(stdlib.h 헤더파일에 존재)

ex)

free(ip);    //할당 받은 기억공간 반환

 

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

int main(){
 int a = 10;
 int* ap;

 ap = (int*)malloc(sizeof(int));
 *ap = 20;
 printf("%d\n", a + *ap);
 free(ap);
 return 0;
}

결과 

 

- 메모리 할당 함수는 힙 영역에 원하는 크기의 메모리가 존재하지 않을 경우 널포인터를 반환

  따라서 프로그램이 중단되지 않게 하기 위해 malloc함수 호출 후 검사하여 널포인터인지 확인해야 함

 

예제 16-1) 일교차 출력 프로그램

최고기온과 최저기온을 저장할 기억공간을 동적으로 할당 후 일교차 출력

#include <stdlib.h>

int main(){
 
 int* ap;
 int* bp;

 ap = (int*)malloc(sizeof(int));
 bp = (int*)malloc(sizeof(int));
 

if(ap==0 && bp==0){    //malloc함수 호출 후 널포인터인지 확인

  printf("메모리가 부족합니다.\n");

}

else{
  printf("최고기온과 최저기온을 입력하세요\n");
  scanf("%d %d", ap, bp);

  printf("일교차는 %d도 입니다.", *ap - *bp);

}

 return 0;

 

결과

 

 

 

동적 할당 기억공간의 활용

 

- 주로 많은 기억공간을 한꺼번에 할당 받아서 배열로 사용하는 것이 효율적

 

- 할당 받은 기억공간의 시작 위치만 포인터변수로 가리키게 하면 포인터변수를 배열명으로 사용하여 배열과 같이 활용

 

- 동적 할당을 사용하여 문자열 처리하기

① 문자열을 입력받기 위해 충분히 큰 크기의 문자 배열 선언

② 문자열 입력 받기

③ 입력된 문자열의 길이를 계산해 크기에 맞게 기억공간을 동적으로 할당

④ 문자열을 할당받은 기억공간에 복사

 

#include <stdlib.h>
#include <string.h>


int main(){
 
 char temp[80];    //①
 char* str[3];
 
 for(int i=0;i<3;i++){
  printf("문자열을 입력하세요 : ");
  gets(temp);    //②
  str[i] = (char*)malloc(strlen(temp)+1);    //③
  strcpy(str[i], temp); //④
 }
 
 for(int i=0;i<3;i++){
  printf("%s\n", str[i]);
 }
 
 for(int i=0;i<3;i++){
  free(str[i]);
 }


 return 0;
}

결과

 

 

- 주의할 점은 포인터 변수나 포인터 배열을 자동변수로 선언하면 쓰레기값이 존재하게 되므로 선언과 동시에 널포인터로 초기화해주는 것이 좋다.

ex)

선언시 : char* str[100]={0};

저장된 문자열 출력시:

for(int i=0;str[i]!=0;i++){

printf("%s\n", str[i]);

}

 

예제 16-2) 행렬의 합

1  2   3  4        12 11 10 9         13 13 13 13

5  6   7  8    +   8  7  6   5    =   13 13 13 13

9 10 11 12        4  3   2  1         13 13 13 13    만들기

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int* ap[3];
 int* bp[3];
 int* cp[3]; //행렬의 합
 for(int i = 0; i < 3; i++) { //메모리 동적 할당을 해준다
  ap[i] = (int *) malloc(sizeof(int));
  bp[i] = (int *) malloc(sizeof(int));
  cp[i] = (int *) malloc(sizeof(int));
 }
 for(int i = 0; i < 3; i++) {
  for(int j = 0; j < 4; j++) { // 각 요소의 합을 cp행렬에 저장한다.
   ap[i][j] = 4*i + 1*(j+1);
   bp[i][j] = 12 - 4*i - 1*j;
   cp[i][j] = ap[i][j] + bp[i][j];
  }
 }
 for(int i = 0; i < 3; i++) {
  for(int j = 0; j < 4; j++) {
   printf("%d\t", cp[i][j]);
  }
  printf("\n");
 }
 return 0;
}

결과

 

 

 

메인함수의 전달인자

 

- 명령행에서 프로그램을 실행시킬 때는 프로그램의 이름 외에도 프로그램에 필요한 정보를 함께 입력할 수 있는데 이들을 명령행 전달인자 라고 한다.

 

- 메인함수의 전달인자를 사용하는 방법

#include <stdio.h>

int main(int argc, char** argv){
 for(int i=0;i<argc;i++){
  printf("%s\n", argv[i]);
 }
 return 0;
}

위의 코드를 작성 후 cmd창을 켜 위의 코드가 저장되어 있는 경로로 이동한다.

그리고 (파일명) (전달인자) (전달인자) 를 입력한다.

결과

 

 

 

기타 동적 할당 함수

 

- calloc함수 : 배열을 할당 받고 초기화 한다.

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

int main(){
 double* ap;
 ap=(double*)calloc(5, sizeof(double));
 for(int i=0;i<5;i++){
  printf("%lf\n", ap[i]);
 }
 return 0;
}

결과

 

 

- realloc함수 : 기억공간의 크기를 조절한다.

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

int main(){
 int* ip;
 int size = 5;
 int cnt = 0;
 int num;
 
 ip=(int*)calloc(size, sizeof(int));
 while(1){
  printf("양수를 입력하세요");
  scanf("%d", &num);
  if(num<=0) break;
  if(cnt<size){
   ip[cnt++]=num;
  }
  else{
   size+=5;
   ip=(int*)realloc(ip, size*sizeof(int));
   ip[cnt++]=num;
  }
 }
 for(int i=0;i<cnt;i++){
  printf("%5d", ip[i]);
 }
 free(ip);
 return 0;
 
 return 0;
}

결과

 

프로그램을 종료시키지 않는 한 계속 양수를 입력할 수 있다.

 

 

 

 

'Programming > C' 카테고리의 다른 글

C언어 정리(9)  (0) 2015.08.09
C언어 정리(7)  (0) 2015.08.07
C언어 정리(6)  (0) 2015.08.06
C언어 정리(5)  (0) 2015.07.20
C언어 정리(4)  (0) 2015.07.20

+ Recent posts