我正在尝试以递归方式修改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数组传递给函数了,我只是想以递归方式创建模式。我一点一点地做这个(递归仍然不完整) - 现在我只是测试看看数组是否保持来电。
答案 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
部分),因此您打印垃圾。