티스토리 뷰

과거 콘텐츠/C언어.

C언어 정리. 간략하게

머니지니87 2011. 3. 25. 09:38

목차


    반응형


    C언어 정리 요약 했던 것들. 간단하게.

    0이 아닌 모든 수는 True로 인식
    %표기하고 싶을 땐 %% 하면 나옴.
    "는 \" 로 쓰면 됨

    sizeof(배열)/sizeof(배열타입)
    하면 배열의 요소의 개수가 나온다.

    int arr[10] 경우

    배열 사이즈는 40일꺼구
    인트 사이즈인 4로 나누면 10.

    EOF - 입력 함수가 파일의 끝을 의미.
    파일이 아니고 키보드 입력의 경우
    CTRL + Z로 인식. 중지.


    문자 입.출력 함수(putchar, fputc, getchar, fgetc)
     
    getchar, fgetc 한 문자만 입력 받아서 반환.
    fgetc는 파일에서도 입력 받을 수 있다. (파일 내용 읽기)

    putchar, fputc 한 문자만 출력.
    fputc는 파일로도 출력 할 수 있다. (파일에 내용 쓰기)



    문자열 입.출력 함수(puts, fputs, gets, fgets) 
     
    puts, fputs 문자열 출력. 
    fputs 는 자동으로 줄바꿈. 

    gets, fgets - 문자 열을 입력 받아서 반환
    fgets 정해진 글자수 만큼만 입력 받는다.

    문자배열이 입력 받는 문자열보다 작을수 있으므로.
    때문에 거의 fgets만 사용한다고 한다.


    문자열 복사 함수 (strcpy, strncpy)
    strcpy(새 변수, 원본) - 복사 함수.
    strncpy(새변수, 원본, (sizeof(새변수)/sizeof(새변수타입))-1)
     - 원본이 새 변수 보다 작을 경우 
    새 변수의 길이 보다 하나 작은 만큼만 복사.
    그리고 새변수[sizeof(새변수)-1 = '\0' 
    문자열의 마지막을 알리기 위해서 null 추가.
    그러기 위해서 -1만큼만 복사 한것.
    변수라 했지만, 사실상 배열인 경우에 사용함. 

    문자열 추가 함수 (strcat, strncat) [문자열 붙이기]
    strcat(변수1, 변수2) - 1 뒤에 2 붙이기.
    strncat(변수1, 변수2, 길이) - 길이만큼만 붙이기
     - 변수1의 길이가 모자랄 수도 있으므로.
    strlen(변수) - 문자열의 길이 반환
    알아서 null 전까지만 계산해서 반화해 주지만
    직접 키보드로 입력해서 확인하는 경우
    엔터를 입력하는 것까지 포함하기 때문에
    원래 길이에 +1 이 된다.
    strcmp(변수1, 변수2) - 같은지 검사.
    변수 1이 2보다 크면 양수값, 작으면 음수값. 
    ABC 와 ABD중 큰 것은 ABD 사전처럼
    뒤쪽에 나오는게 큰거라 생각하면 됨
    strncmp - 위와 같지만 개수를 정할 수 있음
    3번째 글자까지 검사 하게 끔 하는 것 처럼.
    변수라 했지만, 사실상 배열인 경우에 사용함. 


    int atoi(char *ptr);  - 문자열을 int 형태로 변환
    long atol(char *ptr); - 문자열을 long 형태로
    double atof(char *ptr); - 문자열을 double

    int toupper(int c); - 소문자를 대문자로
    int tolower(int c); - 대문자를 소문자로

    int fflush(FILE * stream) - 버퍼를 지우는 함수
    성공시 0, 실패시 EOF 반환
    입력의 경우 그 버퍼 내용이 삭제 되지만
    출력의 경우 삭제가 아닌, 목적지로 출발이다.
    즉, 모니터에 바로 출력된다는 의미이다.

    숫자인지 아닌지 구분하기 보단,
    그냥 아스키 코드 값(48~57)으로 맞는지 아닌지 확인.

    int atoi(char *ptr) - 문자열을 int형 데이터로 변환
    long atoi(char *ptr) - 문자열을 long 형으로
    double atoi(char *ptr) - 문자열을 double 형으로

    int toupper(int c) - 소문자를 대문자로
    int tolower(int c)  - 대문자를 소문자로
    (ctypes.h 에 있으므로 사용시 선언해줘야 함)

    구조체와 ->연산자 .연산자
    구조체 선언 2가지 방법
    정의와 동시에 선언하는 방법과 따로 하는 방법.
    struct 구조체명
    {
    int x;
    int y ;
    } p1, p2;

    또는

    struct 구조체명
    {
    int x;
    int y ;
    struch point p1, p2, p3;


    참고.
    함수의 크기. 하나의 함수는 하나의 기능만을 갖는게 좋음.

    구조체와 포인터. 주의점
    (*pman).name - 괄호를 사용해야 하는 이유는
    . 연산자가 *연산자 보다 우선순위가 높기 때문이다.
    괄호를 하지 않으면 *(pman.name) 이런식이
    되어버린거나 마찬가지다. .연산자를 우선하기 때문에.

    call by value 인 경우. 
    &주소로 넘기고 *포인터로 받는게 아닌경우
    함수를 선언해서 구조체를 넘겨 받을시
    함수 선언보다 구조체 선언이 더 위에 있어야 한다.

    void swap(struct simple test);
    struct simple
    {
    int t1;
    int t2;
    };
    이렇게 함수 선언이 먼저 나오면 에러..... - -;
    swap 함수선언에서 simple 구조체를 찾지 못함.

    하지만, call by reperence 인경우는 상관없음.
    void swap(struct simple* test);
    하고 swap(&구조체명) 할때는 상관 없다.

    대신 레퍼런스의 경우 .연산자가 아닌 ->로 써야함.
    반대로 벨류의 경우는 .연산자를 사용해야 한다.

    구조체 멤버에 scanf 받을 때도 & 꼭 써줄것.
    구조체를 반환하는 함수를 사용할 때는
    struct 만 쓰는게 아니라 어떤 struct 를 사용할지
    같이 써주어야 한다. 만들어 놓은 구조체 명.
    struct point PointAdd();
    point 라는 구조체를 반환하는 PointAdd 함수 선언.

    함수에서 구조체를 리턴한 경운 메인에서는
    받는 구조체가 있어야 한다.
    result = PointAdd(f,s)
    result 라는 구조체도 만들어줘야 한다.
    당연히 반환받는 구조체와 같은 구조체로. point
    typedef 자료형의 이름을 다른 것으로.
    typedef int test : int를 int 대신 test로. 
    아마. 주로 그런 선언을 간편하게 하기위해 쓰는듯.
    구조체도 가능한데, typedef strcut simple S
    라고 하면 구조체 선언시 원래는
    struct simple s ;     struct simple 다 썼었지만
    S로 대체해서, S s; 이렇게만 쓰면 끝.

    선언과 동시에 변경하는경우

    typedef struct simple
    {
    .
    .
    } S;
    이렇게 하면 구조체 선언과 동시에 typedef 선언.


    매크로함수
    #define SQUARE(x) x*x;
    int square(int x);

    int a = 3
    printf("SQUARE : %d",  SQUARE(a+3));
    printf("SQUARE : %d",  square(a+3));

    처음껀 15가 나오고 두번째껀 36이 나온다.

    일반함수의 경우 (a+3)*(a+3) 즉 덧셈을 먼저하지만
    매크로 함수는 a+3*a+3 되어서 곱셈이 먼저 된다.

    이걸 방지하기 위해서는 SQUARE((a+3)) 도 있지만
    매번 신경쓰기 힘들기 때문에 좋은 방법이 아니고,
    매크로를 선언할 때 ((x)*(x)) 감싸주는게 좋다.

    헤더파일 선언시 "" 사용은 주로 사용자가 만든경우.
    <>은 표준 디렉토리에서 찾으라는 의미.
    그러니까 ""는 표준 디렉토리에 없는 곳도 찾는다.
    현재 소스파일이 있는 곳부터 검색한다고 함.


    %x - 16진, u - 부호없는 10진,
    i - 부호 없는 8진, o - 부호 있는 8진
    %p - 인수에 지정된 포인터 주소 값을 16진수로.
    %n - 출력된 문자수를 인수에 저장.

    - 왼쪽 정렬 (기본은 오른쪽 정렬) 
    즉 공간이 남을 시에 어느쪾을 공백으로 채울지.

    + 부호 있는 변환에서 앞에 부호 문자를 붙임.
    0 여백을 0으로 채움.
    공백 양수값은 +기호 대신 공백. 음수는 -
    # 다음 변환 지정자에 따른 형식사용
    0  : 0을 앞에 붙임.
    x,X : 0x또는 0X를 붙임.
    e,E,f : 항상 소수점을 붙임.
    g, G : 항상 소수점 붙임 뒷부분 0 생략 안함.


    int main(int argc, char* argv[])
    argc -> argv 배열의 크기 (커맨드 라인 +1)
    argv[0] -> 프로그램 파일의 경로와 파일명의 문자열
    argv[1] -> 첫번 째 인수.

    여러개의 문자가 아닌, "문자열" 인 경우

    char 형의 다차원 배열이 아니라
    char *a[] 포인터 배열을 사용한다.
    (그래서 문자열 배열 이라고도 표현한다.) 


    특정 범위 내의 정수를 발생시키는 방법
    (rand() % (최대 - 최소+1) + 최소값;

    rand()함수는 원래가 가짜 난수함수이다.
    의사난수 라고 하는데, 발생하는 순서가
    정해져 있다.

    srand()는 함수 인자를 이용하 의사 난수의
    발생시작 위치를 결정.
    보통 srand((unsigned)time(NULL)); 사용.
    time()함수는 시간을 초단위까지 정수로 반환.
    NULL과 함께 사용하면 현재 시간 반환

    rand() 대신 srand()를 사용하는게 아니라
    rand()를 사용할 때 시작을 정해주기 위해서
    srand()함수를 같이 사용하는 것이다.





     
    반응형