C언어 문자열 질문입니다
조회수 574회
제가 짠 첫 번째 코드 입니다. 우선 코드 먼저 보여드리면
/*
<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 **pstr
이 char *str
을 가리키도록 받고있고있습니다. 그럼 현재의 모습은 위의 그림과 같습니다.
그리고 동적 할당을 하고 난 후의 모습은
위처럼 동적할당을 받게되면 malloc
함수의 리턴값을 pstr
이 가리키기 때문에 더이상 str
을 가리킬 수 없게되고 당연하지만 str
이 동적 할당 받은 배열을 가리킬 순 없습니다.(사실 의도하고 싶었던건 str
로 pstr
이 동적할당 한 배열을 가리키게 하고 싶었음).
그래서 위의 코드를 수정해서
#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++로 넘어가려고 생각중에 있는데 포인터에와 동적할당 부분을 아직도 어렵게 느끼고 있어서 입니다.. 그림으로 제가 알고 있는 내용을 최대한 설명해 드리려고 했고 나름대로 자세히 코드를 짠 과정과 내용을 설명 해 드렸는데, 혹시 위의 코드에서 제가 잘못 사용하고 있다거나 이상한 부분이나 위의 내용중에서 제가 잘못 알고 있다거나 놓치고 있는 내용이 있다면 답변으로 알려 주시면 정말 감사하겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
댓글 입력