Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何调试';导致堆栈溢出错误的原因是什么?_C_Visual Studio_Visual C++ - Fatal编程技术网

C 如何调试';导致堆栈溢出错误的原因是什么?

C 如何调试';导致堆栈溢出错误的原因是什么?,c,visual-studio,visual-c++,C,Visual Studio,Visual C++,我想解决的问题是KR2练习1-22;'编写一个程序,将长输入行“折叠”成两行或多行,位于输入第n列之前的最后一个非空字符之后。请确保您的程序对很长的行执行智能操作,如果指定列“”之前没有空格或制表符 我尝试使用一个刚刚卡住的递归函数 错误行为示例: 你好,世界> 地狱 o我 o我 o我 o我 .. … 预期行为: 你好,世界> 地狱 o我 rld 错误行为的第二个示例: 世界杯> h e llo 洛 llo 洛 llo llo .. … 次要预期行为: 世界杯> h e llo wor ld 见

我想解决的问题是KR2练习1-22;'编写一个程序,将长输入行“折叠”成两行或多行,位于输入第n列之前的最后一个非空字符之后。请确保您的程序对很长的行执行智能操作,如果指定列“”之前没有空格或制表符

我尝试使用一个刚刚卡住的递归函数

错误行为示例:
你好,世界>
地狱
o我
o我
o我
o我
..

预期行为:
你好,世界>
地狱
o我
rld

错误行为的第二个示例:
世界杯>
h e
llo
洛 llo
洛 llo
llo
..

次要预期行为:
世界杯>
h e
llo
wor
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);
}
#包括
#定义页面宽度5
#定义MAXLINE 1000
int getline(字符行[],int maxline);
无效折叠(字符行[],整数开始);
/*之后,将长输入行“折叠”为两行或多行较短的输入行
在第n个字符之前出现的最后一个非blnk字符
输入列*/
int main()
{
int len;/*当前线路长度*/
字符行[MAXLINE];/*当前输入lne*/
而((len=getline(line,MAXLINE))>0)
如果(长度>页面宽度)
折叠(直线,0);
返回0;
}
/*getline:将一行读入s,返回长度*/
int getline(字符s[],int lim)
{
int c,i;
c=0;
对于(i=0;i对于(i=0;i这是一个好问题。首先,我认为递归解决方案在这里并不理想。我认为它适用于您提供的输入,但考虑到
PAGEWIDTH
有多小,您可能会遇到输入较大的问题。使用循环会使您的生活更轻松,并产生更可靠的函数

也就是说,您的问题在于您在
fold()
函数中进行的递归调用,您提供了错误的开始索引。这意味着您没有按照每次调用的顺序前进。此外,您没有明确定义基本情况(即何时结束递归)。您可以通过修改for循环条件或将字符串长度(n)传递给函数并检查start>n来完成此操作

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

我不确定你在寻找什么样的答案,但如果这些建议不能让你更接近,我就在一个粘贴箱中粘贴了一个补丁。我没有在这里发布它,以防你想自己解决它


希望能奏效,如果我遗漏了什么,请告诉我。

我会开始使用调试器。但是为什么要递归地而不是使用循环?这样做感觉更直观。如果我不能解决当前问题,我计划重写它以迭代方式工作。我已经使用了打印语句和调试器,尽管我'我仍然感到困惑。在fold函数的初始调用中使用调试器并检查变量“start”,值为0。在随后的调用中,值为-129496704,而不是给定的第一个示例“hello world”输入所预期的4。打印参数(start)不过,fold提供的数据确实显示了4。我认为编译器优化可能是造成差异的原因,因为在某种程度上事情仍在运行。在以下for循环中似乎出现了问题:
for(I=0;I提示:问题是在折叠> /Cord>函数的最后两行中。提示2:考虑什么是 LSTNB实际上表示。递归可以是解决问题的好方法;但是当您发现自己在递归函数定义中编写循环时,或者返回函数“<代码>无效”的递归函数定义时
,你应该想知道你是否在正确的轨道上。顺便说一句,你的函数定义是尾部递归的;C不保证尾部调用消除,但GCC确实支持它。不过,我不知道还有其他C编译器做过这种优化,我严重怀疑MSVC做过这种优化。