我一直在尝试读取文件的行。我只想要空格后的内容。这是我的代码:
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);
然后我将数据保存在结构中并打印。
该代码在大多数情况下都有效,但是有时我会遇到分段错误错误。我正在尝试使用此文本。
Nom SW-01
MAC 89F107457A36
服务器本地主机
服务器端口2019
可能是什么问题?
答案 0 :(得分:0)
在嵌套循环中,您已获取空格后的所有字符,直到到达\ 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;
}
}
顺便说一句,实际上我根本不喜欢您的代码!我的建议只是修复您的代码的补丁,但是绝对有更好的方法来编写您想要做的代码。