当我的程序在main中返回0时,程序退出,但控件不会返回命令行。我甚至尝试过exit(),但没有用。任何建议
int main (int argc, char* argv[])
{
char name[100];
char reg[200];
char replace[200];
if(argc==3){
strcpy(reg, ".*");
strcat(reg, argv[1]);
strcat(reg, ".*");
}
else if(argc==4){
strcpy(reg, "\\(\\(.*");
strcat(reg, argv[3]);
strcat(reg, ".*");
strcat(reg, argv[1]);
strcat(reg, ".*\\)\\|\\(.*");
strcat(reg, argv[1]);
strcat(reg, ".*");
strcat(reg, argv[3]);
strcat(reg, ".*\\)\\)");
printf("\n%s\n", reg);
// exit(1);
}
printf("\n%s\n", reg);
strcpy(name, argv[1]);
strcpy(replace, argv[2]);
printf("\n%s\n", name);
// puts(realpath("./b/test2",NULL));
int reti;
char msgbuf[100];
regex_t regex;
/* Compile regular expression */
reti = regcomp(®ex, reg, 0);
if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }
list_dir (".", regex, name, replace);
char line[BUFSIZ];
FILE *fp2=fopen("source.dat","r");
if(fp2==NULL)
printf("Problm opening: source.dat");
FILE *fp3=fopen("result.dat", "r");
if(fp3==NULL)
printf("Problm opening: result.dat");
char line2[1000];
int len;
while( (fgets(line2, BUFSIZ, fp2) != NULL) && (fgets(line, BUFSIZ, fp3) != NULL)) {
len=strlen(line);
if( line[len-1] == '\n' )
line[len-1] = '\0';
len=strlen(line2);
if( line2[len-1] == '\n' )
line2[len-1] = '\0';
rename(line, line2);
}
close(fp2);
free(fp2);
close(fp3);
free(fp3);
remove("source.dat");
remove("result.dat");
regfree(®ex);
return 0;
}
我的程序执行我打算执行的操作,但是当它完成while循环并释放所有内容时,如果不按ctr-C,控制权不会返回命令行。仍然难以理解为什么。
答案 0 :(得分:4)
嗯,如果没有一个完整的程序,很难说。基于所呈现的代码,跳出的最明显的错误是文件句柄使用情况。 API的工作方式如下:通过调用fopen()来分配FILE *,通过调用fclose()来释放它。相反,你在FILE *上调用close()然后(!)将它传递给free()。
我不确定您使用的确切语言/版本,但如果您要求进行更多错误检查,您的编译器可能会帮助您找到此问题。例如,带-Wall的gcc会警告它必须对close(),free()等使用隐式声明。添加正确的头文件后(因此它可以看到你正在使用的函数的原型声明) ,然后它会说:
warning: passing arg 1 of `close' makes integer from pointer without a cast
为您提供错误地使用close()的线索。