在空格后阅读行

时间:2019-02-18 09:24:25

标签: c file-read

我一直在尝试读取文件的行。我只想要空格后的内容。这是我的代码:

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

可能是什么问题?

1 个答案:

答案 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;
    }
}

顺便说一句,实际上我根本不喜欢您的代码!我的建议只是修复您的代码的补丁,但是绝对有更好的方法来编写您想要做的代码。