편집 기록

편집 기록
  • 프로필 편집요청빌런님의 편집
    날짜2020.02.09

    C언어 문자열 질문입니다


    제가 짠 첫 번째 코드 입니다. 우선 코드 먼저 보여드리면

    /*
    
                                    <1>
    
    */
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define MAX_STR_COUNT 6
    #define MAX_TEMP_COUNT 100
    
    void PRINT_ARRAY(char* pstr[], int length);
    void CREATE_ARRAY(char* pstr[], int size);
    void BUBBLE_SORT(char* pstr[], int length);
    void SWAP(char** x, char** y);
    
    int main() {
    
        char* str = NULL;
    
        printf("Please input string.\n");
    
        CREATE_ARRAY(&str, MAX_STR_COUNT);
    
        printf("\t[ Before Bubble Sort ]\n");
        PRINT_ARRAY(&str, MAX_STR_COUNT);
    
        BUBBLE_SORT(&str, MAX_STR_COUNT);
    
        printf("\t[ After Bubble Sort ]\n");
        PRINT_ARRAY(&str, MAX_STR_COUNT);
    
        return 0;
    }
    void PRINT_ARRAY(char* pstr[], int length) {
    
        for (int i = 0; i < length; i++) {
    
            printf("%s\n", *(pstr + i));
        }
        printf("\n");
    
    }
    
    void CREATE_ARRAY(char* pstr[], int size) {
    
        char temp[MAX_TEMP_COUNT];
        int len = 0;
    
        pstr = (char**)malloc(sizeof(char*) * MAX_STR_COUNT);
    
        if (pstr != NULL) {
            for (int i = 0; i < size; i++) {
    
                gets_s(temp, MAX_TEMP_COUNT);
                len = strlen(temp);
    
                *pstr = (char*)malloc(sizeof(char) * (len + 1));
                strcpy_s(*(pstr + i), len + 1, temp);
            }
        }
    }
    
    void BUBBLE_SORT(char* pstr[], int length) {
    
        int index = 0;
    
        for (int i = 0; i < length - 1; i++) {
    
            index = i;
            for (int j = i + 1; j < length; j++) {
    
                if (strcmp(pstr[index], pstr[j]) > 0)
                    index = j;
            }
    
            SWAP(&pstr[index], &pstr[i]);
        }
    }
    
    void SWAP(char** x, char** y) {
    
        char* temp;
        temp = *x;
        *x = *y;
        *y = temp;
    
    }
    

    Create_Array()함수에서

    이미지

    이런식으로 char **pstrchar *str을 가리키도록 받고있고있습니다. 그럼 현재의 모습은 위의 그림과 같습니다.

    그리고 동적 할당을 하고 난 후의 모습은

    이미지

    위처럼 동적할당을 받게되면 malloc함수의 리턴값을 pstr이 가리키기 때문에 더이상 str을 가리킬 수 없게되고 당연하지만 str이 동적 할당 받은 배열을 가리킬 순 없습니다.(사실 의도하고 싶었던건 strpstr이 동적할당 한 배열을 가리키게 하고 싶었음).

    그래서 위의 코드를 수정해서

    #include <stdio.h>
    
    int main() {
    
        char* str;
    
        str = CREATE_ARRAY(&str);
    }
    
    char* CREATE_ARRAY(char* pstr) {
    
        /*
        작업
        */
        return *pstr;
    }
    

    Create_array함수에서 위의 코드와 마찬가지의 작업을 하고 메인함수의 str에서 동적할당 받은 배열에 접근하기 위해서 주솟값을 리턴하는 코드입니다. Create_array 함수에서는 *pstr을 리턴한 이유는 main 함수에서 str의 차원과 맞추려는 의도로 리턴을 했고 실제로 실행 시킨 결과 당연하지만 str이 리턴받은 값은 pstr이 동적 할당을 받고나서 문자열을 복사하고 난 첫번째 배열의 시작 주소이기 때문에 str로는 동적 할당받은 메모리를 전부 사용하지 못했습니다. 그래서 아래 코드가 최종 수정 본 입니다.

    /*
    
                                    <2>
    
    */
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define MAX_STR_COUNT 5
    #define MAX_TEMP_LENGTH 100
    
    
    char* CREATE_ARRAY(char** pstr, int length);
    void PRINT_ARRAY(char** pstr, int length);
    void BUBBLE_SORT(char** pstr, int length);
    void SWAP(char** x, char** y);
    
    int main() {
    
        char* str = NULL;
        char** pstr = NULL;
    
        pstr = CREATE_ARRAY(&str, MAX_STR_COUNT);
    
        printf("\t[ Before Bubble Sort ]\n");
        PRINT_ARRAY(pstr, MAX_STR_COUNT);
    
        BUBBLE_SORT(pstr, MAX_STR_COUNT);
    
        printf("\t[ After Bubble Sort ]\n");
        PRINT_ARRAY(pstr, MAX_STR_COUNT);
    
        for (int i = 0; i < MAX_STR_COUNT; i++) {
    
            free(*(pstr + i));
        }
        free(pstr);
    
        return 0;
    
    }
    char* CREATE_ARRAY(char** pstr, int length) {
    
        char temp[MAX_TEMP_LENGTH];
        int len = 0;
    
        pstr = (char**)malloc(sizeof(char*) * length);
        if (pstr != NULL) {
    
            printf("Please input string.\n");
    
            for (int i = 0; i < length; i++) {
    
                gets_s(temp, MAX_TEMP_LENGTH);
                len = strlen(temp);
    
                *(pstr + i) = (char*)malloc(sizeof(char) * (len + 1));
                if (*(pstr + i) != NULL) {
                    strcpy_s(*(pstr + i), len + 1, temp);
                }
                else exit(0);
            }
        }
        else
            exit(0);
    
        return pstr;
    }
    
    void PRINT_ARRAY(char** pstr, int length) {
    
        for (int i = 0; i < length; i++) {
    
            printf("%s\n", *pstr);
            pstr++;
        }
        printf("\n");
    }
    
    void BUBBLE_SORT(char** pstr, int length) {
    
        int index = 0;
    
        for (int i = 0; i < length - 1; i++) {
    
            index = i;
            for (int j = i + 1; j < length; j++) {
    
                if (strcmp(*(pstr + index), *(pstr + j)) > 0)
    
                    index = j;
            }
    
            SWAP(&pstr[index], &pstr[i]);
        }
    }
    
    void SWAP(char** x, char** y) {
    
        char* temp;
        temp = *x;
        *x = *y;
        *y = temp;
    
    }
    

    Create_array 함수에서 pstr 이차원 포인터를 리턴하고 메인함수에서 복사할 char **pstr을 만들어서 대입을 합니다. 그러면 메인함수에서 만든 pstr은 동적 할당 받은 메모리를 전부 사용 할 수 있게됩니다. 그런데 위의 코드에서 오류가 생기는데 오류 내용은

    1.'=': 'char **' differs in levels of indirection from 'char *'
    2.'return': 'char *' differs in levels of indirection from 'char **'
    

    입니다.

    최종적으로 수정한 코드에서 13째 줄과, 42번째 줄에서 오류가 발생하는데 Create_array함수에서 이차원의 포인터를 리턴했고, 메인함수에서도 char **pstr로 받고있는데 두개의 차원이 다르다고 하는 이유를 잘 모르겠습니다.(최종 질문)

    쪽팔리지만 이렇게 그림을 그리면서 까지 제가 코드를 짠 과정을 설명드리는 이유는 이제 c++로 넘어가려고 생각중에 있는데 포인터에와 동적할당 부분을 아직도 어렵게 느끼고 있어서 입니다.. 그림으로 제가 알고 있는 내용을 최대한 설명해 드리려고 했고 나름대로 자세히 코드를 짠 과정과 내용을 설명 해 드렸는데, 혹시 위의 코드에서 제가 잘못 사용하고 있다거나 이상한 부분이나 위의 내용중에서 제가 잘못 알고 있다거나 놓치고 있는 내용이 있다면 답변으로 알려 주시면 정말 감사하겠습니다.

  • 프로필 알 수 없는 사용자님의 편집
    날짜2020.02.09

    C언어 문자열 질문입니다


    제가 짠 첫 번째 코드 입니다. 우선 코드 먼저 보여드리면

    /*

                                <1>
    

    */

    include

    include

    include

    define MAX_STR_COUNT 6

    define MAX_TEMP_COUNT 100

    void PRINT_ARRAY(char* pstr[], int length); void CREATE_ARRAY(char* pstr[], int size); void BUBBLE_SORT(char* pstr[], int length); void SWAP(char** x, char** y);

    int main() {

    char* str = NULL;
    
    printf("Please input string.\n");
    
    CREATE_ARRAY(&str, MAX_STR_COUNT);
    
    printf("\t[ Before Bubble Sort ]\n");
    PRINT_ARRAY(&str, MAX_STR_COUNT);
    
    BUBBLE_SORT(&str, MAX_STR_COUNT);
    
    printf("\t[ After Bubble Sort ]\n");
    PRINT_ARRAY(&str, MAX_STR_COUNT);
    
    return 0;
    

    } void PRINT_ARRAY(char* pstr[], int length) {

    for (int i = 0; i < length; i++) {
    
        printf("%s\n", *(pstr + i));
    }
    printf("\n");
    

    }

    void CREATE_ARRAY(char* pstr[], int size) {

    char temp[MAX_TEMP_COUNT];
    int len = 0;
    
    pstr = (char**)malloc(sizeof(char*) * MAX_STR_COUNT);
    
    if (pstr != NULL) {
        for (int i = 0; i < size; i++) {
    
            gets_s(temp, MAX_TEMP_COUNT);
            len = strlen(temp);
    
            *pstr = (char*)malloc(sizeof(char) * (len + 1));
            strcpy_s(*(pstr + i), len + 1, temp);
        }
    }
    

    }

    void BUBBLE_SORT(char* pstr[], int length) {

    int index = 0;
    
    for (int i = 0; i < length - 1; i++) {
    
        index = i;
        for (int j = i + 1; j < length; j++) {
    
            if (strcmp(pstr[index], pstr[j]) > 0)
                index = j;
        }
    
        SWAP(&pstr[index], &pstr[i]);
    }
    

    }

    void SWAP(char** x, char** y) {

    char* temp;
    temp = *x;
    *x = *y;
    *y = temp;
    

    }

    Create_Array()함수에서

    이미지

    이런식으로 char **pstr이 char *str을 가리키도록 받고있고있습니다. 그럼 현재의 모습은 위의 그림과 같습니다.

    그리고 동적 할당을 하고 난 후의 모습은

    이미지

    위처럼 동적할당을 받게되면 malloc함수의 리턴값을 pstr이 가리키기 때문에 더이상 str을 가리킬 수 없게되고 당연하지만 str이 동적 할당 받은 배열을 가리킬 순 없습니다.(사실 의도하고 싶었던건 str로 pstr이 동적할당 한 배열을 가리키게 하고 싶었음).

    그래서 위의 코드를 수정해서

    include

    int main() {

    char* str;
    
    str = CREATE_ARRAY(&str);
    

    }

    char* CREATE_ARRAY(char* pstr) {

    /*
    작업
    */
    return *pstr;
    

    }

    Create_array함수에서 위의 코드와 마찬가지의 작업을 하고 메인함수의 str에서 동적할당 받은 배열에 접근하기 위해서 주솟값을 리턴하는 코드입니다. Create_array 함수에서는 *pstr을 리턴한 이유는 main 함수에서 str의 차원과 맞추려는 의도로 리턴을 했고 실제로 실행 시킨 결과 당연하지만 str이 리턴받은 값은 pstr이 동적 할당을 받고나서 문자열을 복사하고 난 첫번째 배열의 시작 주소이기 때문에 str로는 동적 할당받은 메모리를 전부 사용하지 못했습니다. 그래서 아래 코드가 최종 수정 본 입니다.

    /*

                                <2>
    

    */

    include

    include

    include

    define MAX_STR_COUNT 5

    define MAX_TEMP_LENGTH 100

    char* CREATE_ARRAY(char** pstr, int length); void PRINT_ARRAY(char** pstr, int length); void BUBBLE_SORT(char** pstr, int length); void SWAP(char** x, char** y);

    int main() {

    char* str = NULL;
    char** pstr = NULL;
    
    pstr = CREATE_ARRAY(&str, MAX_STR_COUNT);
    
    printf("\t[ Before Bubble Sort ]\n");
    PRINT_ARRAY(pstr, MAX_STR_COUNT);
    
    BUBBLE_SORT(pstr, MAX_STR_COUNT);
    
    printf("\t[ After Bubble Sort ]\n");
    PRINT_ARRAY(pstr, MAX_STR_COUNT);
    
    for (int i = 0; i < MAX_STR_COUNT; i++) {
    
        free(*(pstr + i));
    }
    free(pstr);
    
    return 0;
    

    } char* CREATE_ARRAY(char** pstr, int length) {

    char temp[MAX_TEMP_LENGTH];
    int len = 0;
    
    pstr = (char**)malloc(sizeof(char*) * length);
    if (pstr != NULL) {
    
        printf("Please input string.\n");
    
        for (int i = 0; i < length; i++) {
    
            gets_s(temp, MAX_TEMP_LENGTH);
            len = strlen(temp);
    
            *(pstr + i) = (char*)malloc(sizeof(char) * (len + 1));
            if (*(pstr + i) != NULL) {
                strcpy_s(*(pstr + i), len + 1, temp);
            }
            else exit(0);
        }
    }
    else
        exit(0);
    
    return pstr;
    

    }

    void PRINT_ARRAY(char** pstr, int length) {

    for (int i = 0; i < length; i++) {
    
        printf("%s\n", *pstr);
        pstr++;
    }
    printf("\n");
    

    }

    void BUBBLE_SORT(char** pstr, int length) {

    int index = 0;
    
    for (int i = 0; i < length - 1; i++) {
    
        index = i;
        for (int j = i + 1; j < length; j++) {
    
            if (strcmp(*(pstr + index), *(pstr + j)) > 0)
    
                index = j;
        }
    
        SWAP(&pstr[index], &pstr[i]);
    }
    

    }

    void SWAP(char** x, char** y) {

    char* temp;
    temp = *x;
    *x = *y;
    *y = temp;
    

    }

    Create_array 함수에서 pstr 이차원 포인터를 리턴하고 메인함수에서 복사할 char **pstr을 만들어서 대입을 합니다. 그러면 메인함수에서 만든 pstr은 동적 할당 받은 메모리를 전부 사용 할 수 있게됩니다. 그런데 위의 코드에서 오류가 생기는데 오류 내용은

    1.'=': 'char *' differs in levels of indirection from 'char *' 2.'return': 'char *' differs in levels of indirection from 'char *'

    입니다.

    최종적으로 수정한 코드에서 13째 줄과, 42번째 줄에서 오류가 발생하는데 Create_array함수에서 이차원의 포인터를 리턴했고, 메인함수에서도 char **pstr로 받고있는데 두개의 차원이 다르다고 하는 이유를 잘 모르겠습니다.(최종 질문)

    쪽팔리지만 이렇게 그림을 그리면서 까지 제가 코드를 짠 과정을 설명드리는 이유는 이제 c++로 넘어가려고 생각중에 있는데 포인터에와 동적할당 부분을 아직도 어렵게 느끼고 있어서 입니다.. 그림으로 제가 알고 있는 내용을 최대한 설명해 드리려고 했고 나름대로 자세히 코드를 짠 과정과 내용을 설명 해 드렸는데, 혹시 위의 코드에서 제가 잘못 사용하고 있다거나 이상한 부분이나 위의 내용중에서 제가 잘못 알고 있다거나 놓치고 있는 내용이 있다면 답변으로 알려 주시면 정말 감사하겠습니다.