C 程序关于 grep



im 此代码有问题,它关于转换为 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 在程序名称行后更改为奇怪的值

首次调试时

您需要分解问题,也许可以询问您将创建的特定示例。此代码中可能存在多个问题。

对于段错误,我建议在调试器中进行单步执行..(如 GDB(。 此外,最好将问题隔离到几行,而不是期望有人为您调试整个代码。

例如:

/

/parameter -s 'c.h.a.r'/usr/share/dict/words,但它在 argv[0] 中没有检测到任何字符串,所以这不会进入 while 循环

用参数测试一下 - 一个 'c.h.a.r'

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

这工作正常,拾取"-"。

等等。

相关内容

  • 没有找到相关文章

最新更新