Чтение строк после пробела - PullRequest
0 голосов
/ 18 февраля 2019

Я пытался прочитать строки файла.Я хочу только то, что после пробела.Вот код, который у меня есть:

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

Сервер localhost

Сервер-порт 2019

В чем может быть проблема?

1 Ответ

0 голосов
/ 18 февраля 2019

Во вложенном цикле вы выбрали все символы после пробела, пока не дойдете до \ n.Но когда процесс завершен, вы возвращаетесь к первому циклу, и значение i не изменилось, и оно продолжается от следующего символа после пробела снова, и это может существовать в другом месте в строке, поэтому вы повторите строку несколько раз.раз для каждого пробела в строке!

Поэтому из-за char resultat[4][256] вы можете достичь предела и превысить границу массива.

Вы можете обновить значение i после завершения строкиi=x:

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

Кстати, на самом деле мне совсем не понравился ваш код!И я предлагаю просто патч для исправления вашего кода, но, безусловно, есть гораздо лучший способ написать код для того, что вы хотите сделать.

...