Invisible Rover 's Blog :D ::

함수 이름 리턴 값

isalnum()

전달인자가 영문자이거나 숫자일경우 true값을 반환한다.
isalpha() 전달인자가 영문자[소문자 + 대문자] 일경우 true값을 반환한다.
isdigit() 전달인자가 숫자[0~9] 일경우 true값을 반환한다.
isxdigit() 전달인자가 16진수[0~9 , a~f , A~F]이면 true를 반환한다.
islower() 전달인자가 소문자[a~z] 일경우 true값을 반환한다.
isupper() 전달인자가 대문자[A~Z] 일경우 true값을 반환한다.
ispunct() 전달인자가 구두점일경우 true값을 반환한다.
isspace() 전달인자가 화이트스페이스[공백,엔터,케리지리턴,수평탭,수직탭,용지이송] 일경우 true값을 반환한다.
iscntrl() 전달인자가 제어문자일경우 true값을 반환한다.
isascii() 전달인자가 아스키코드일경우 true값을 반환한다.
isgraph() 전달인자가 빈칸이 아닌 인쇄할 수 있는 문자일경우 true값을 반환한다.
isprint() 전달인자가 인쇄가능한 문자일경우 true값을 반환한다.
tolower() 전달인자가 대문자이면 소문자로 바꾸어서 리턴한다. 그렇지 않을경우 그냥 리턴한다.
toupper() 전달인자가 소문자이면 대문자로 바꾸어서 리턴한다. 그렇지 않을경우 그냥 리턴한다.

빨강색으로 칠해놓은 함수들은 많이 활용되는 함수들이고 그밖에 나머지 함수들은 활용할 기회가 없어서 많이 활용해보지 못했다.
위 함수들은 매우 활용적이다 가령
if((ch >= 'a' || ch <= 'z') || (ch >= 'A' || ch<= 'Z')) 이런 조건문은 if(isalpha()) 라고 표시하는것과 전혀 다르지 않으며 프로그램의 가독성을 향상시켜줄수 있다.


cctype라이블러리의 함수를 사용한 예제



Tag // c, c++, cctype, ctype.h

댓글을 달아 주세요

프로그램을 실행하면 운영체제는 메모리를 할당한다. 단순히 메모리공간 하나만 떡 하니 제공하는것이 아니라 적절하고 효율적이며 용도에 맞게 메모리공간을 나누어 놓았다.

내가 아는 한도에서 큐,스텍,힙,데이터 영역 이렇게 4가지를 들어봤는데 그중 큐만 제외한 나머지에관해 포스팅 해볼까한다.; 사실 큐에관해 아직 잘모른다.. FIFO라고 의미와 원리만 알뿐...; 삭제 삽입을 하기위해 원형으로 묶어준다는거밖에는 잘모르겟다 캬~^^;;


데이터 영역
전역변수, static 변수를 위한 공간이다. 이 두 변수는 프로그램이 실행되자마자 데이터 영역의 메모리를 차지하며 프로그램이 종료될때야 비로소 메모리에서 해제된다. 전역변수는 말그대로 함수 외부에 선언하는 변수이고 static 변수는 시작부터 0으로 초기화되며 데이터가 누적되는 변수이다. 일반적으로 static변수에 관한 오해가 있을거 같아 잠깐 그 부분에관해 설명좀 해볼까함 ㅋㅋ

#include<iostream>

void start(void){
    static int lee;
}

int main(){
    start();

    return 0;
}

lee 변수는 언제 메모리를 치자힐까?? 대다수의 사람들은 메인함수에서 start함수를 호출하고 나서 메모리를 차지한다고 생각할지도 모른다. 하지만 절대 그렇지않다. 전역변수나 static변수는 위에서 언급했듯이 프로그램이 실행되자마자 데이터 영역의 메모리를 차지한다. 그렇다면 저 static int lee는 무슨의미일까? 바로 0으로 초기화 하기위한 작업이다. 일반적으로 변수를 선언하면 auto변수라해서 초기화되지않은 쓰레기값이 들어가지만 static을 붙이면 0으로 초기화한다.


스텍 영역
컴파일타임 즉, 번역시간에 메모리공간을 차지하는 영역이다. 함수에 접근해서 읽어낸 변수는 대부분 스텍영역에 메모리를 배정받는다. 블록구조의 규칙을 엄격히 여겨 한 블록내에서 선언된 변수는 그 블록이 끝날때 메모리가 해제된다.

#include<iostream>
int main(){
    int lee;
    return 0;
}
짧지만 강력한 예제 ㅋㅋㅋㅋ;;
lee변수는 컴파일과 동시에 4바이트의 메모리공간을 차지할것이다. 10번을 하던 100번을 하던 같은 크기의 메모리 공간을 차지한다.


힙 영역
실행시간에 메모리공간을 차지하는 영역이다. 사용자가 직접 메모리를 할당해야하며 해제또한 사용자가 직접 해줘야한다.

#include<iostream>

using std::cin;

void get(int i=0);


int main(){
    int size;
    cin>>size;
    get(size);
    return 0;
}

void get(int i){
    int array[i];
}

int array[i]이런식의 변수선언은 스텍에 할당하라는 명령과 같다. 사용자의 입력을 통해서 배열의 크기가 조절될수있기때문이다. 분명 이 조건에 따른다면 힙에 메모리가 할당되야한다. 하지만 이 소스는 100% 컴파일 에러가 난다. 이런식으로 힙영역에 메모리를 차지할수 없기때문이다. 그렇기 때문에 malloc또는 new 연산자가 있는것이다.

#include<iostream>

using std::cin;
using std::cout;
using std::endl;

void get_put(int i=0);

int main(){
    int size;
    cout<<"할당할 크기의 숫자를 입력하세요"<<endl;
    cin>>size;
    cin.get();
    get_put(size);
    return 0;
}

void get_put(int i){
    int * array = new int[i];
    cout<<i*4<<"만큼의 바이트가 확보되었습니다."<<endl
        <<"아무키나 누르면 메모리를 해제합니다"<<endl;
    cin.get();
    delete [] array;
    cout<<"메모리가 해제되었습니다"<<endl;
}

위 소스야말로 정말 올바른 소스가 되겠다.

댓글을 달아 주세요

알아가면 갈수록 정말 심오한 개념들이... -ㅅ-;
흠.. 후기는 아래서쓰고 일단 닥치고 포스팅 ㄱㄱ

new연산자를 이용한 동적배열 할당.
C에서의 malloc을 이용해서도 동적배열할당이 가능했는다.
malloc(sizeof()*n));
n값을 통해 원하는 크기만큼의 배열을 동적할당할수있었는데 솔직히 2차원까지는 생각도 못했엇다.

C에서의 2차원 동적할당 예

c에서 2차원 동적할당 예제보기


C++에서 2차원 동적할당하기.

#include<iostream>
int main(){
    using namespace std;
   
    int i,a=5,b=5;
    int **pt = new int*[a];        //5행만큼 동적할당.

    for (i=0; i<a; i++){        //열의 수만큼 각 행에 동적으로 메모리 공간을 할당함 */

        pt[i] = new int[b];
    }
   
    for(i=0; i<a; i++){
        delete [] pt[i];    //열에 해당하는 메모리공간 해제
    }
    delete [] pt;            //행에 해당하는 메모리 공간 해제
   
    return 0;
}


C와 비교해서 거의 달라진게 없다. 그리고 2차원 동적할당이라는게 어디에 쓰이는지 잘모르겟다능 ㄷㄷ;
그저 구조체에 할당하는것밖에는 잘모르겟다..; ㅋㅋㅋ

2차원 동적할당의 원리는 2차원 포인터에 행을 깔아놓고 그 행의 원소에 다시한번 동적할당을 하는건데
사용자 삽입 이미지
그림판 작이라 이해점;;ㅋ


마치 이런모양과도 같다.
원하는 만큼의 길이를 할당할수도있다.  으..; 이런 형태의 배열을 내가 1학년때 물어봤는데; 그땐 너무 몰랏다능;;

댓글을 달아 주세요

  1. 도레비 2008/04/01 22:10  address  modify / delete  reply

    퍼갑니다.^^

+ . 데이터 로드
1 . 데이터 입력
2 . 데이터 관리
3 . 데이터 저장
4 . 프로그램종료

크게 4분류로 되어있으며
로드기능은 프로그램 시작시 가능케함. 그이후론 로드 불가능.
참고로 로드기능을 활용하려면 주소록.txt 파일이 실행파일과 같은 위치상에 존재해야하며
형식이 존재한다. 형식에 맞지않을경우 데이터 로드가 불가능하니 주의하도록.
데이터 형식은 세이브후 저장된 txt파일을 열어서 확인가능하며 txt파일 끝의 \n은 없도록 하자.[자동으로 없음]

제작기간 : 2007.12.28 ~2008.1.19
느낀점 : 오나전 케안습 만들고나니 희열이 느껴진다. ㅋㅋ

+ 동적할당후 해제를 하지않은것에 대해 다시 보안하고 올림.
free함수를 통해 노드를 하나하나 읽어내고 heap으로부터 메모리를 환함.


주소록 소스보기

댓글을 달아 주세요

  1. BlogIcon cocy 2008/03/11 20:37  address  modify / delete  reply

    오 참고하겟음 ㅋㅋ
    횽은 먼저 가계부를 만들겠다
    코가 삐뚤어지게 마시다 오너라 캬캬걐걐갸

소스 들쳐보기


api함수가 만연한 지금... 핸들이니 뭐니하는데 쪼금 이해가 가는듯..
api홈피가서 이것저것 뒤져보는데 역시나.... 영어를 모르면 프로그래밍 하지 말라이건가 ㅠㅠ;

영어는 몰라도 함수의 기능과 구조를 알면 그걸로 된다고 생각하는 1人

댓글을 달아 주세요

  1. BlogIcon 서동민 2008/02/23 17:50  address  modify / delete  reply

    영어는 몰라도 함수의 기능과 구조를 알면 그걸로 된다고 생각하는 2人
    ... 굳게 믿고 있고 진실 이여야만 해...
    영어는 OTL

  2. BlogIcon 서동민 2008/02/23 21:13  address  modify / delete  reply

    system("mode con: lines=27"); // 커맨드창 크기(행)조절, 초기 25

    cls처럼 system으루 창 크기 키워주는 명령어 써서!
    열로 줄이기도 되던가?는 기억안나지만 ;ㅁ;
    mode con 로 찾아보면 더 나올듯...

    • BlogIcon 〃Rover〃 2008/02/23 22:04  address  modify / delete

      아... 것보다 그냥 백그라운드를 통째로 배열로해서 포인터로 하나하나 갈키면서 그려아하나 ㅠㅠ; 아 이거 그리기 너무힘들다 ㅠㅠ;

  3. BlogIcon 서동민 2008/02/24 00:09  address  modify / delete  reply

    배경은 게임시작할때 한번 그려주고 거의 변하지 않으니까 저렇게 해도 될꺼같은데?
    아니면 직사각형의 프레임을 그려주는 함수를 만들어서 소스를 조금 줄일수도 잇을꺼같고

    프레임그리기(x,y,w,h){
    반복(){
    gotoxy(x,y) ┌ㅡㅡ....┐// 반복문으로 w넓이만큼
    gotoxy(x,y+1) │...........│
    gotoxy(x,y+h) └ㅡㅡㅡ...┘
    }
    }
    이렇게 생긴 함수만들어서...

    그리고 배경 안에있는 실제 게임 부분(블럭내려오고,쌓여있고) 하는 부분은 배열로 그려주구..

    • BlogIcon 〃Rover〃 2008/02/24 00:21  address  modify / delete

      허힝;;
      걍 숫자쓰고 변형시켯듬 ㅠ;
      저 백그라운드 배열이랑 블럭 스타일 배열이랑
      매치시켜서 이동이동이동...