C언어 문자열 질문입니다

조회수 566회

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

/*

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

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)