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

у меня проблемы с этим кодом, речь идет о строке поиска из файла после преобразования в 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 на странное значение после строки с именем программы

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


person devss    schedule 22.06.2019    source источник
comment
У вас нарушено форматирование. Пожалуйста исправьте.   -  person user14063792468    schedule 22.06.2019
comment
Ваш второй аргумент командной строки — «-s». Ваш третий аргумент командной строки — «c.h.a.r». Условие цикла while останавливается на третьем аргументе командной строки.   -  person user14063792468    schedule 22.06.2019
comment
Весь *++argv[0] выглядит таким сложным и странным. Изменение argc и argv обычно не лучшая идея, а смешивание разыменования, приращения и индексации в одном операторе очень неясно. Может быть, было бы намного лучше взять значения в отдельные переменные и работать с ними. Иначе через некоторое время даже не вспомнишь, что делает код и зачем.   -  person Sami Kuhmonen    schedule 22.06.2019
comment
@ЯрославМашко я добавил изменение значения argv изображения на странное значение в lin if ((progname = strrchr(*argv, '/')) == NULL), можете ли вы подробнее объяснить, что условие цикла while останавливается на третьем аргументе командной строки?   -  person devss    schedule 22.06.2019
comment
Не могу сказать по картинкам. Должен запустить ваш код в какой-то среде. Я проверю это позже. Кстати, не размещайте ссылки на изображения. Это плохая практика на SO. Лучше отформатируйте вывод как текст.   -  person user14063792468    schedule 22.06.2019


Ответы (1)


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

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

E.g.:

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

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

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

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

И так далее.

person v01d    schedule 22.06.2019
comment
я добавляю изображение, я отлаживаю с помощью gdb, а также с блоком кода, но это странно, после if ((progname = strrchr(*argv, '/')) == NULL) -> эта строка argv меняется на мусор, почему? - person devss; 22.06.2019
comment
У меня нет такого поведения с этими строками вашего кода, это работает. удалите ВЕСЬ другой код и повторите попытку.. - person v01d; 23.06.2019