我一直试图读取文件的行。我只想要一个空间之后的东西。这是我的代码:
void readFile()
{
char line[256]; /* linia */
int line_num = 0; /* numero de linia */
char resultat[4][256]; /* nom i valor del parametre els iguals els ignorem*/
int i=0;
int j=0;
int x=0;
FILE * f;
f = fopen(file_to_read, "r");
if (f==NULL) { fputs ("File error",stderr); exit (1); }
while(fgets(line, 256, f) != NULL) {
for (i=0;i<256;i++)
{
if (line[i]==' ')
{
j=0;
for (x=i+1; x<256 && line[x] != '\n';x++)
{
resultat[line_num][j]=line[x];
j++;
}
resultat[line_num][j] = '\0';
line_num++;
}
}
}
fclose(f);
然后我将数据保存在结构中并打印出来。
代码大部分时间都有效,但有时我会得到分段错误错误。我正在尝试用这个文字。
名称SW-01
MAC 89F107457A36
服务器localhost
服务器端口2019
可能是什么问题?
在嵌套循环中,您已获取空格后的所有字符,直到到达\ n。但是当进程结束时你回到第一个循环并且i的值没有被改变,它再次从空格后面的下一个字符继续,并且可能在该行中存在另一个空格,所以你将重复几行线上每个空间的时间!
因此,由于char resultat[4][256]
,您可能会达到极限并超出阵列的边界。
您可以在完成i=x
行后更新i值:
for (i=0;i<256;i++)
{
if (line[i]==' ')
{
j=0;
for (x=i+1; x<256 && line[x] != '\n';x++)
{
resultat[line_num][j]=line[x];
j++;
}
resultat[line_num][j] = '\0';
line_num++;
i=x;
}
}
顺便说一下,实际上我根本不喜欢你的代码!我的建议只是修补你的代码的补丁,但肯定有更好的方法来编写你想要做的代码。