程序没有退出

时间:2013-02-07 19:53:15

标签: c exit

当我的程序在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(&regex, 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(&regex);
   return 0;
}

我的程序执行我打算执行的操作,但是当它完成while循环并释放所有内容时,如果不按ctr-C,控制权不会返回命令行。仍然难以理解为什么。

1 个答案:

答案 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()的线索。