修改递归函数中的二维数组C

时间:2015-10-22 19:53:31

标签: c string recursion multidimensional-array

我正在尝试以递归方式修改2D字符数组(字符串数组),但在第一次递归调用之后,即使更改在基本情况下注册,数组也会返回空白

int main(int argc, const char * argv[]) {

int height;
printf("Enter the height of your triangle.\n");
scanf("%d", &height);


printf("Lets see if you were successful!\n");
fractalTriangle(height, 1);

}

void fractalTriangle (int height, int fractalLevel) {

//has to make the array and do the printing all in the same function
char trianglePattern [height][2 * height - 1];

if (fractalLevel == 0) {
    int rowSize = 2 * height - 1;
    char rowString[rowSize]; //string to store in pattern's array
    int asteriskCount = 1; //number of asterisks printed in each row
    int spaces = (rowSize - asteriskCount) / 2; //how many spaces need to be printed in this current row

    int rowCount;
    for (rowCount = 0; rowCount < height; rowCount++) {
        char *ptr = trianglePattern[rowCount];
        int counter = 0;
        int astCounter = 0;
        int spCounter = 0;

        while (spCounter < spaces) {
            if (counter == 0) {
                strcpy(rowString, " ");
            }
            else {
                strcat(rowString, " ");
            }
            counter++;
            spCounter++;
        }

        while (astCounter < asteriskCount) {
            if (counter == 0) {
                strcpy(rowString, "*");
            }
            else {
                strcat(rowString, "*");
            }
            counter++;
            astCounter++;
        }

        spCounter = 0;
        while (spCounter < spaces) {
            strcat(rowString, " ");
            spCounter++;
        }

        asteriskCount+=2;
        spaces--;
        strcpy(ptr, rowString);
        //printf("%s\n", trianglePattern[rowCount]);
        //printf("%s\n", rowString);
    }
}

else {
    fractalTriangle(height/2, fractalLevel - 1);
    printf("%s\n", trianglePattern[0]);
    printf("%s\n", trianglePattern[1]);
    printf("%s\n", trianglePattern[2]);
    printf("%s\n", trianglePattern[3]);

}

}

为什么数组会重置?我无法想象这是一个范围问题,因为数组本身是在函数内声明的。目的是打印一个分形三角形,这样就不需要将2D数组传递给函数了,我只是想以递归方式创建模式。我一点一点地做这个(递归仍然不完整) - 现在我只是测试看看数组是否保持来电。

2 个答案:

答案 0 :(得分:3)

由于您在函数范围内定义了数组,因此每个函数都会在堆栈上创建一个新的2D字符数组。该函数仅对 2D字符数组的实例进行操作。到递归存在时,将打印原始未修改的2D字符数组。

您需要在递归函数之外定义一个字符数组,然后将该字符数组(或者更确切地说是指向它的指针)传递给递归函数。

答案 1 :(得分:0)

我不知道你的代码应该做什么,但这是做的

您对递归函数的第一次(外部)调用(来自main)是:

fractalTriangle(height, 1);

在函数内部,您跳过自if以来的第一个fractalLevel == 1语句,并在else部分中使用fractalLevel == 0以递归方式再次调用该函数。

该调用不会进入另一个递归调用,也不会打印任何内容。

一旦递归调用返回,返回第一级(从main调用的那个),继续执行:

printf("%s\n", trianglePattern[0]);
printf("%s\n", trianglePattern[1]);
printf("%s\n", trianglePattern[2]);
printf("%s\n", trianglePattern[3]);

trianglePattern根本未初始化(立即进入else部分),因此您打印垃圾。