我正在尝试编写一个程序,获取输入
step
并以 LATEX 格式打印以下内容:
输出是
1+\frac{2+\frac{4}{5}}{3+\frac{6}{7}}
这是我编写的代码,但输入超过
*** stack smashing detected ***: terminated
时会出现 6
错误。
知道如何管理这个(至少对于低于 10 的输入)?
#include <stdio.h>
#include <stdlib.h>
void frac(int start, int step, char *result) {
if (step == 1) {
sprintf(result, "%d", start);
} else {
char left[256];
char right[256];
frac(2 * start, step - 1, left);
frac(2 * start + 1, step - 1, right);
sprintf(result, "%d+\\frac{%s}{%s}", start, left, right);
}
}
int main() {
int step;
scanf("%d", &step);
char result[1024];
int start = 1;
frac(start, step, result);
printf("%s\n", result);
return 0;
}
您会收到堆栈粉碎消息,因为您会导致函数中的缓冲区溢出。
对于步骤 2-6,所得长度为 13、37、91、203、427。 这意味着,任何额外的步骤,长度都会增加一倍以上。
第 7 步已经超出了您的缓冲区长度。也许不在
result
缓冲区中,但显然在 left
和 right
缓冲区中,它们应该约为 result
大小的一半。
您需要为字符串提供更大的缓冲区。
由于您的缓冲区位于大小有限的堆栈上,您也可以更改为动态分配缓冲区。