C언어 문자열 질문입니다

조회수 147회

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

/*

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

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

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.