Сегментация неисправности (Core Dump) не может понять, почему - PullRequest
0 голосов
/ 22 октября 2018

РЕДАКТИРОВАТЬ: Я решил проблему с выходным файлом (всегда с учетом регистра).Но первая проблема с ошибкой сегментации все еще существует.

* РЕДАКТИРОВАТЬ 2: Итак, я запустил GDB, и это пришло *

      Program received signal SIGSEGV, Segmentation fault.
     _IO_new_fclose (fp=0x0) at iofclose.c:54
      54        if (fp->_IO_file_flags & _IO_IS_FILEBUF)

РЕДАКТИРОВАТЬ 3: Это показывает, что ошибка находится в fclose (файл) на lineCounter mygrep.c: 42

У меня проблема с моей C-программой.Чтобы дать ему немного информации, для нашего первого назначения нас попросили реализовать команду grep в системах на основе UNIX в C. У нас есть аргументы, такие как grep [-i] [-o outfile] ключевое слово filename (для чтения).

, если присутствует [- i] , искомое ключевое слово будет нечувствительным к регистру.

, если указано [- o outfile] ,результат будет записан в этом файле.В противном случае оно будет передано на экран.

ключевое слово - шаблон, который мы должны искать, а filename - имя файла, который будет прочитан.

Все шло нормально, пока я не попытался реализовать раздел [- o outfile] , где он проверяет, имеет ли он значение NULL или нет.

Без присутствия [-o outfile] программа успешно выводит результат на экран (без учета регистра и с учетом регистра), но в конце выдает Ошибка сегментации (ядро сброшено) несмотря на то, что работает.

Итак, для визуализации проблемы это выглядит так:

EXAMPLE.IN имеет =

ARduino

ретард

ARD

    mygrep -i ard example.in

Эта команда печатает

    ARduino
    retard
    ARD
    Segmentation Fault(core dumped)

То же самое относится и к регистру, но оно работает

   mygrep -i ard example.in
   ard
   Segmentation Fault(core dumped)

Я действительно не мог понять, почему это происходит, я новичок в CЯ обычно пишу на Java.

Вот метод main.c:

 #include <stdio.h>
 #include <stdlib.h>
 #include <getopt.h>
 #include "mygrep.h"
 int main(int argc, char **argv)
 {
   bool caseSensitive = true;
   char *outfile = NULL;
   int c;

   while((c= getopt(argc,argv,"io:"))!= -1)
   {
     switch(c)
     {
       case 'i' : caseSensitive = false;
                  break;
       case 'o' : outfile = optarg;
                  break;
       default:
                  break;
      }

    }
   char *keyword = argv[optind];
   char *inputfile = argv[optind+1];
   mygrep(inputfile,caseSensitive,keyword,outfile);
 }

Метод mygrep.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mygrep.h"
static int lineCounter(char filename[])
{
   FILE *file = fopen(filename,"r");
   int lines,c;
   lines = 0;
   if(file)
   {
      while((c = getc(file)) !=EOF)
      {
         if(c == '\n')
         {
           ++lines;
         }
      }
   }
   fclose(file); //** THIS IS THE LINE WHERE DEBUGGER GETS ERROR**
   return lines;
}

int mygrep(char filename[],bool caseSensitive,char pattern[],char outfile[])
{
  char str[100];
  int lines = lineCounter(filename);
  FILE *file = fopen(filename,"r");
  FILE *out;
  int i = 0;
  if (outfile != NULL)
  {
     out = fopen(outfile,"w");
  }

  if(file == NULL)
  {
    perror("Error opening file");
    exit(EXIT_FAILURE);
  }

  while(i<lines)
  {
      if(fgets (str,100, file)!= NULL )
      {
          if(caseSensitive)
          {
              if(strstr(str,pattern) != NULL)
              {
                 if(outfile == NULL)
                 {
                    printf("%s",str);
                 } else
                 {
                     fprintf(out,"%s",str);
                 }
              }
          } else 
          {
              if(strcasestr(str,pattern) != NULL)
              {
                 if(outfile== NULL)
                 {
                    printf("%s",str);
                 } else 
                 {
                      fprintf(out,"%s",str);
                 }
              }
          }
      }
      ++i;
}
fclose(out);
fclose(file);
return 0;
}
...