为什么此循环(C)会产生细分错误?

时间:2018-08-23 14:46:42

标签: c segmentation-fault

这是一个C程序,应接受终端的输入并返回输入的最长行以及该行的长度。我知道它效率不高,但是我正在尝试使用我现在知道的一些函数进行编写。在运行它时,它返回一个分段错误。在线调试器指出了第30行(在下面的代码中进行了标记),但未指定问题。我也不确定,我一直在寻找。此错误的根源是什么?

顺便说一句,我知道可能还有其他错误。我想自己找那些。我只需要解决该细分错误。

#include <stdio.h>
#define MAX 200

int start = 0;
int i, j, k, x, finish;
int longlength;
char text[MAX];
char longest[MAX];

int main()
{
fgets (text, MAX, stdin);

for (i = start; text[i] != EOF; i++)
{
    if (text[i] == '\n')
    {
        finish = i - 1;
        break;
    }
}
for (j = start; j <= finish; j++)
{
    longest[j - start] = text[j];
}
longlength = finish - start;

for (k = finish + 1; (text[k] = '\n') && (text[k] != EOF); k++)
{
start = k;  //*****This is line 30*****
for (i = start; (text[(i + 1)] != '\n') && (text[(i + 1)] != EOF); i++)
{
}
finish = i;
if ((finish - start) > longlength)
{
    longlength = (finish - start);
    for (x = start; x <= finish; x++)
    {
        longest[(x - start)] = text[x];
    }
}
}
printf ("This is the longest line : %s.\n Its length is %d.", longest, longlength);
return 0;
}

2 个答案:

答案 0 :(得分:2)

text[i]永远不会(或几乎永远不会)为EOF(通常定义为-1),因此您的第一个循环不会终止(除非字符串包含{{1} }。 C中的字符串以null终止,因此您应该检查\n(空字符)。

您应该尝试在调试器中运行代码,以查看发生了什么。

答案 1 :(得分:0)

C中的字符串通常以\0终止,这就是为什么必须将其设置为循环终止的原因。

您的情况:

for (i = start; text[i] != '\0'; i++)
{
    //statements
}

为什么不使用EOF
您可以将其用于文件,例如.csv或普通.txt文件。普通的char数组对此不起作用。