Чтение строк после пробела

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

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

МАК 89F107457A36

Локальный хост сервера

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

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


person Víctor Serrano    schedule 18.02.2019    source источник
comment
изменить for (i=0;i<256;i++) на for (i=0;line[i];i++)   -  person Mayur    schedule 18.02.2019
comment
может быть, line_num становится больше 3? Поскольку первое измерение массива resultat имеет только размерность 4. Вы можете отладить его или, по крайней мере, вывести line_num на стандартный вывод.   -  person Chris623    schedule 18.02.2019
comment
Я думаю, что ваш цикл ищет позицию в буфере, которая не имеет значения, и это потому, что вы предполагаете, что в файле есть строки до 256 байтов, что опасно. Я рекомендую вам читать с помощью метода read() или убедиться, что строки имеют такую ​​длину.   -  person MarcS    schedule 18.02.2019
comment
Пожалуйста, сделайте правильный отступ в коде, который вы публикуете здесь.   -  person meaning-matters    schedule 18.02.2019
comment
Изменение условия for (строка [i]) решило проблему. Спасибо! Извините за отступ, у меня он был правильный, но когда я вставил его, я не понял, что отступ был неправильным.   -  person Víctor Serrano    schedule 18.02.2019


Ответы (1)


Во вложенном цикле вы извлекаете все символы после пробела, пока не достигнете \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;
    }
}

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

person HmT    schedule 18.02.2019
comment
Извините, я не очень привык кодировать на C, это было первое, что пришло мне в голову. - person Víctor Serrano; 18.02.2019
comment
Нет, извините, проблема была в первом для - person Víctor Serrano; 20.02.2019