C언어 재귀함수를 이용해서 문자열 출력하는 것에 대해 질문합니다.

조회수 1768회

2개의 알파벳 ab를 사용해서 길이가 3인 문자열을 출력하면

aaa
aab
aba
abb
baa
bab
bba
bbb

이렇게 나오게 해야합니다. 2차원 문자 배열을 동적으로 할당받고 Dicstr 함수는 a와 b를 규칙에 맞게 저장하도록 했습니다. 그런데 비주얼스튜디오에서 돌리면 3을 입력하면 프로그램이 강제 종료되고 4을 넣으면

 if (n > 1) {       
    while (len > i) {
         for (i = my_pow(2, n); i < 3*my_pow(2, n-1); i++)
            strcat(dic[i], "a");            
        for (i = 3* my_pow(2, n-1); i < my_pow(2, n+1); i++)
            strcat(dic[i], "b");        
    }   
}

여기에서 예외가 발생했다고 합니다.

혹시 제가 못본 오류가 있나요. 그렇다면 제발 살려주세요..

#pragma warning (disable : 4996)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int my_pow(int base, int exp) {

    //pow함수를 직접 만들어야 합니다.

    int i, j;
    j = base;
    for (i = 0; i < exp - 1; i++)
        j = j * base;

    return j;
}

void Dicstr(char **dic, int n, int len)
{

    char ab[2][2] = { "a", "b" };
    int i = 0;
    int k;

    if (n == 1) {
        i = 0;
        while (i < len) {
            for (k = 0; k < 2; k++) {
                strcat(dic[i], ab[k]);
                i++;
            }
        }
        return;
    }
    if (n > 1) {
        for (i = 0; i < my_pow(2, n - 1); i++)
            strcat(dic[i], "a");
        for (i = my_pow(2, n - 1); i < my_pow(2, n); i++)
            strcat(dic[i], "b");
    }
    if (n > 1) {
        while (len > i) {
            for (i = my_pow(2, n); i < 3*my_pow(2, n-1); i++)
                strcat(dic[i], "a");
            for (i = 3* my_pow(2, n-1); i < my_pow(2, n+1); i++)
                strcat(dic[i], "b");
        }
    }
    if (n > 1)
        Dicstr(dic, n - 1, len);
}

void strPrint(char **str, int num) {

    int i;

    for (i = 0; i < my_pow(2, num); i++)
        printf("%s\n", str[i]);

}

int main(void) {

    int num = 0;
    int i;
    char **new;
    int len = 0;

    scanf("%d", &num);
    len = my_pow(2, num);

    new = (char **)calloc(len, sizeof(char *)); //2차원 문자 배열 동적 할당
    for (i = 0; i < len; i++)
        new[i] = (char *)calloc(len, sizeof(char));

    Dicstr(new, num, len); //사전 순으로 배열 만드는 함수
    strPrint(new, num); //출력하는 함수

    for (i = 0; i < len; i++) { //동적 할당 해제
        free(new[i]);
    }
    free(new);

    return 0;
}

1 답변

  • new[i] = (char *)calloc(len, sizeof(char));

    len 이 아닌 문자열을 담을 최대길이를 넘겨야할 것 같군요. 1024랄지..?

    • (•́ ✖ •̀)
      알 수 없는 사용자

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

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

(ಠ_ಠ)
(ಠ‿ಠ)