c программой про grep - PullRequest
       30

c программой про grep

0 голосов
/ 22 июня 2019

У меня возникли проблемы с этим кодом, примерно строка поиска из файла после преобразования в dfa и nfa всякий раз, когда я пытаюсь получить доступ к значению argv, он дает "0x7fffffffe977" XDG_MENU_PREFIX = gnom "..." может быть значение мусора? хотя я не увеличиваю argv (?)

хотя у меня есть параметр в аргументах, таких как -s 'c.h.a.r' / usr / share / dict / words кто-то может подсказать, почему произошла эта ошибка?

//parameter -s 'c.h.a.r' /usr/share/dict/words

#include "regmatch.h"
#include <string.h>
#include <strings.h>

#define BUFSIZE 256

int debug = 0;     
char *reg_string;

static void do_grep(FILE *fp);
static void usage_exit(void);
static void show_region(char *p, char *from, char *to);
static char *match_line(char *str, char **cpp);
static char *match_string(char *str);

static int vflag = 0;  
static int sflag = 0;  
static int dflag = 0; 
static char *progname;

int main(int argc, char *argv[])
{
  FILE *fp;
  char c, doption = '0';
  ptree *root;


  if ((progname = strrchr(*argv, '/')) == NULL)
    progname = *argv;
  else
    progname++;

/*option*/
  while (--argc > 0 && (*++argv)[0] == '-' ) { //parameter -s 'c.h.a.r' /usr/share/dict/words, but it not detect any string in argv[0] so this not 
enter while loop why?
    while ((c = *++argv[0])) {
      switch(c) {
      case 'v':
    vflag = 1;
    break;
      case 's':
    sflag = 1;
    break;
      case 'd':
    dflag = 1;

    if (!(isdigit(doption = *++argv[0]))) {
      fatal_error("error");
      usage_exit();
    }
    break;
      default:
    fatal_error("there is error in option");
    usage_exit();
    break;
      }
    }
  }

  if (argc-- < 1) {
    fatal_error("error");
    usage_exit();
  }

  reg_string = *argv++;

  if (dflag) {
    if (sflag || vflag) {

      fatal_error("cannot input -d and -s option together");
      usage_exit();
    }
    switch(doption) {
    case '1':
      lexer();
      break;
    case '2':
      parse();
      break;
    case '3':
      make_nfa();
      break;
    case '4':
      make_dfa();
      break;
    default: 
      fatal_error("-d option 1 until 4");
      usage_exit();
      break;
    }
    exit(0);  
  }

  //make dfa
  get_token();
  root = eval_expr();  //make tree
  if (curr_token != EOREG) 
    parse_error();
  gen_nfa(root);    //change to nfa
  gen_dfa();        //change to dfa



  if (argc < 1) {

    do_grep(stdin);
  } else { //if parameter include file name


    while(*argv){ //here also the value of argv is weird , it give endless loop ....

    printf("%s",argv[0]);


    while (argc-- > 0) {
      if ((fp = fopen(*argv++, "r")) == NULL) {
    fatal_error("cant open file");
    exit(1);
      }
      do_grep(fp);
      fclose(fp);
    }

    }

  }

  return 0;
}

argv изменить на странное значение после строки программы

при первой отладке

1 Ответ

0 голосов
/ 22 июня 2019

Вам нужно разбить проблему, возможно, спросите о конкретных образцах, которые вы создадите. В этом коде может быть несколько проблем.

Для segfault я рекомендую один шаг в отладчике ... (например, gdb). Кроме того, лучше, если вы изолируете проблему в несколько строк, а не ожидаете, что кто-то отладит весь ваш код для вас.

Например:

// параметр -s 'c.h.a.r' / usr / share / dict / words, но он не обнаруживает ни одной строки в argv [0], поэтому он не вводится во время цикла

Проверьте только это с параметрами -a 'c.h.a.r'

/*option*/
  while (--argc > 0 && (*++argv)[0] == '-' )
    printf("opt=> '%s'\n", argv[0]);

Это отлично работает, поднимает '-'.

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...