편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2020.04.26

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


    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;
    }
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2020.04.25

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


    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;
    }