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]);
这工作正常,拾取"-"。
等等。