这是一个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;
}
答案 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
数组对此不起作用。