繁体   English   中英

如何调试导致堆栈溢出错误的递归 function?

[英]How can I debug my recursive function that's causing stack overflow error?

我要解决的问题是 KR2 练习 1-22; '编写一个程序,在第 n 列输入之前出现的最后一个非空白字符之后将长输入行“折叠”成两行或多行较短的行。 确保你的程序用很长的行做一些智能的事情,如果在指定的列之前没有空格或制表符。

我试图处理一个递归的 function ,它只是卡住了。

错误行为示例:
你好世界<<输入
output >>
地狱
喔喔
喔喔
喔喔
喔喔
……
...
预期行为:
你好世界<<输入
output >>
地狱
喔喔
rld

错误行为的第二个例子:
他 llo 世界 << 输入
output >>


咯咯咯
咯咯咯

……
...
次要预期行为:
他 llo 世界 << 输入
output >>


工作
ld

请参见下面的代码:

#include <stdio.h>
#define PAGEWIDTH 5
#define MAXLINE 1000

int getline(char line[], int maxline);
void fold(char line[], int start);

/* "fold" long input lines into two or more shorter lines after
  the last non-blnk character that occurs before the n-th
  column of input */
int main()
{
    int len;                /* current line length*/
    char line[MAXLINE];     /* current input lne*/

    while ((len = getline(line, MAXLINE)) > 0)
        if (len > PAGEWIDTH)
            fold(line, 0);
    return 0;
}

/* getline : read a line into s, return length */
int getline(char s[], int lim)
{
    int c, i;

    c = 0;
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';

    return i;
}

void fold(char line[], int start)
{
    int i, lstnb;
    i = lstnb = 0;

    for (i = 0; i < PAGEWIDTH-1 && line[start + i] != '\0'; ++i) {
        if (line[start + i] != ' ')
            lstnb = i;
    }
    for (i = 0; i <= lstnb; ++i)
        putchar(line[start + i]);

    putchar('\n');
    if(line[lstnb + 1] != '\0')
        fold(line, lstnb + 1);
}

好问题。 首先,我认为递归解决方案在这里并不理想。 我让它适用于您提供的输入,但考虑到PAGEWIDTH有多小,您可能会遇到较大输入的问题。 使用循环将使您的生活更轻松,并产生更可靠的 function。

也就是说,您的问题在于您在fold() function 中进行的递归调用,您提供了错误的起始索引。 这意味着您不会在每次通话时都继续前进。 此外,您没有明确定义基本情况(即何时结束递归)。 您可以通过修改 for 循环条件或将字符串长度 (n) 传递给 function 并检查是否 start > n 来做到这一点。

在调试递归函数时,检查基本情况和递归调用始终是一个很好的起点。 这通常是我的问题的来源,很容易假设您正确地完成了它们并在调试时忽略了它们。

我不确定您在寻找什么答案,但如果这些建议没有让您更接近,我在此处的粘贴箱中粘贴了一个修复程序。 我没有在这里发布它以防你想自己解决它。

希望这有效,如果我错过了什么,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM