у меня проблемы с этим кодом, речь идет о строке поиска из файла после преобразования в 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 на странное значение после строки с именем программы
*++argv[0]
выглядит таким сложным и странным. Изменение argc и argv обычно не лучшая идея, а смешивание разыменования, приращения и индексации в одном операторе очень неясно. Может быть, было бы намного лучше взять значения в отдельные переменные и работать с ними. Иначе через некоторое время даже не вспомнишь, что делает код и зачем. - person Sami Kuhmonen   schedule 22.06.2019