ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • c 라이브러리
    잡다한 지식 2020. 9. 4. 19:12

    주로 사용하는 라이브러리와 관련 함수


    1. <stdio.h> : 표준 입출력

    ① scanf() : 입력 // %d int, %lld long long, %f float, %lf double, %c char

    ② printf() : 출력

    ③ getchar() :문자하나입력

    ex) char ch = getchar();


    2. <string.h> : 문자열 함수

    ① strcpy(대상문자열, 원본문자열) : 문자열을 다른 배열이나 포인터(메모리)로 복사

    ex) char s1[10] = "Hello"; //마지막에 NULL문자들어감

         char s2[10];

         strcpy(s2,s1); // s1의 문자열을 s2에 복사

         printf("%s\n", s2);


    ② strlen(문자열포인터 or 문자배열) : 문자열 길이를 반환, NULL부분 포함하지 않고 순수하게 문자열 길이만 구함

       ex) char * s1 = "Hello"; //마지막에 NULL문자들어감

      char s2[10] = "Hello";

      printf("%d",strlen(s1)); // 5 출력

      printf("%d",strlen(s2)); // 5 출력


    ③ strcmp(문자열, 문자열) : 문자열 비교 결과 반환


     strcmp(s1,s2) 의 반환 정수?

     0 : ASCII 코드 기준으로 두 문자열이 같을 때

    -1 : ASCII 코드 기준으로 문자열2(s2)이 클 때

     1 : ASCII 코드 기준으로 문자열1(s1)이 클 때




    ex) char s1[10] = "Hello";

        char *s2 = "Hello";

        int ret = strcmp(s1,s2); //두 문자열이 같으면 0 


    ex ) s1 = "aaa", s2 = "aab"일때

    s1은 ASCII 코드로 97 97 97

    s2는 ASCII 코드로 97 97 98

    aab가 크므로 strcmp(s1,s2) = -1


    ④ strcat(최종문자열, 붙일문자열) : 문자열을 붙여줌

    ex) char s1[10] = "world";

        char s2[20] = "Hello";

         strcat(s2,s1); //s2 뒤에 s1 붙임, Helloworld


        char *s3 = "world";

        char *s4 = "Hello";

        strcat(s4,s3); //ERROR 발생. 문자열 포인터 s4는 읽기 전용 메모리라 문자열 못 붙임


       //문자열을 붙이려면 s4에 쓰기가 가능하도록 malloc함수로 동적 메모리할당 + 문자열 붙일 수 있도록 공간도 넉넉히

        char *s4 = (char *)malloc(sizeof(char) * 20);

        strcat(s4, "Hello");

        strcat(s4, s3); //Helloworld 


    ⑤ strchr(대상문자열, 검색할문자) : 문자열에서 특정 문자 검색

    문자 찾았으면 문자로 시작하는 문자열의 포인터 반환, 없으면 NULL 반환

    ex) char s1[30] = "A Garden Diary";

         char *ptr = strchr(s1,'a'); //'a'로 시작하는 문자열 검색


         while(ptr != NULL){

    printf("%s\n", ptr); //검색된 문자열 출력

    ptr = strchr(ptr+1, 'a'); //포인터에 1더하여 a다음부터 탐색

    }


    //출력 결과

    //arden Diary

    //ary


       strrchr(대상문자열, 검색할문자) : strchr과 달리, 문자열의 끝에서부터 역순으로 검사

    ex) char s1[30] = "A Garden Diary";

         char *ptr = strrchr(s1,'a'); //문자열 끝에서부터 'a'로 시작하는 문자열 검색


         printf("%s",ptr); // ary 출력

    ⑥ strstr(대상문자열, 검색할 문자열) : 문자열 안에서 문자열을 검색

       문자열을 찾았으면 문자열로 시작되는 문자열의 포인터를 반환, 없으면 NULL 반환


       ex) char s1[30] = "A Garden Diary";

           char *ptr = strstr(s1,'den'); // den Diary 출력


      char s2[100] = "A Garden Diary A Garden Diary A Garden Diary";

       char *ptr = strstr(s1,'den'); 


      while(ptr != NULL){

    printf("%s",ptr);

    ptr = strstr(ptr+1,"den");

    }

     //출력결과

    //  den Diary A Garden Diary A Garden Diary

    // den Diary A Garden Diary

    // den Diary


    ⑦ strtok(대상문자열, 기준문자) : 특정문자를 기준으로 문자열을 자르는 방법

       (기준문자를 ' ' 로 묶으면 안된다.)

       (문자열을 새로 생성해서 반환하는 게 아님. 원본 문자열의 내용을 바꾸므로 사용시 주의)

       ex) char s1[30] = "The Little Prince";

            char *ptr = strrok(s1, " "); //공백을 기준으로 문자열을 자름

                                             // " "을 찾아 NULL문자로 채운뒤, 문자열의 첫부분인 "The"를 자름

       while(ptr != NULL){

    printf("%s\n",ptr);

    ptr = strtok(NULL," "); //strtok에 NULL을 넣어 앞에서 잘린 문자열만큼 다음 문자로 이동. 그리고 다시 공백 문자를 찾아서 NULL로 채운 후 자름

    }

       //출력결과

       // The

       // Little

       // Prince


           char *s3 = "The Little Prince";

      char *ptr = strrok(s3, " "); //ERROR 발생. 읽기 전용이라서 사용 불가능


     char *s4 = (char*)(malloc(sizeof(char) * 30);

     strcpy(s4, "The Little Prince");

     char *ptr = strrok(s4, " "); //동적메모리에 들어있는 문자열은 자를 수 있음


    *참고: c언어는 std::string이 존재하지 않음. char[]형태로 문자열 처리


    3. <stdlib.h> : 메모리 동적 할당

    ① malloc() : 

    ② rand() : 난수 발생

    qsort(정렬한 배열 or 메모리 주소, 요소 개수, 요소크기, 비교함수) : 퀵정렬 수행


    ex) //qsort함수를 사용하기 전에 비교함수를 만들어야한다.

        //비교함수를 정의할 때는 반드시 int형 반환값과 const void 포인터 매개변수 2개가 있어야한다.

       // 그리고, 정렬할 배열의 자료형에 따라 const void 포인터를 변환한 뒤 역참조해서 값을 가져와야한다.


       // 여기서는 정렬할 배열이 int형이므로 const void 포인터를 int포인터로 변환한뒤 역참조하여 값을 가져온다.


        //오름차순 정렬

        int cmp(const void *a, const void *b){

    int num1 = *(int *)a; //void포인터를 int형 포인터로 변환한 뒤 역참조해서 값 가져옴

    int num2 = *(int *)b;

    if(num1 < num2) return -1; //a가 b보다 작을 때는 -1 반환

    if(num1 > num2) return 1; // a가 b보다 클 때는 1 반환


    return 0; //a랑 b랑 같을 때는 0 반환

    }

    //혹은 더 간단하게

    int cmp(const void*a, const void*b){

    return *(int *)a - *(int*)b; // 값 반환할때 반드시 -1,1,0일 필요없음. 

        // 같을때만 0 값이 크거나 작을때는 양수 음수 반환하면 된다.

    }

    //내림차순을 정렬하고 싶다면, 부등호만 반대로 바꾸면 된다.


        int number[5] = {8, 4, 5, 3, 2};


        qsort(number, sizeof(number) / sizeof(int), sizeof(int), cmp);


    4. <malloc.h> : 메모리 할당

    ① malloc() : ex) char *s1 = (char *)malloc(sizeof(char) * 10); //char 10개 크기만큼 동작메모리

        printf("%s",s1);

        free(s1); //malloc()함수 사용했으면 프로그램이 끝나기 전 반드시 free()함수를 통해 메모리 해제

       // 그렇지 않으면 메모리 누수가 생김

    ② free()


    5. <math.h> : 산술함수, 반환값 대부분 double

    ① pow(x,y) : x^y승

    ② sqrt(x) : x의 양의 제곱근

    ③ abs(x) : x의 절대값

    ④ sin(x), cos(x), tan(x) ... 등등

    '잡다한 지식' 카테고리의 다른 글

    c언어로 stack, queue 구현  (0) 2020.09.08
    c++ string 변환  (0) 2020.09.07
    lower_bound & upper_bound 함수  (0) 2020.07.12
    bitset 사용법  (0) 2020.05.28
    bit-mask  (0) 2020.04.04

    댓글

Designed by Tistory.