C 应用程序因分段错误而崩溃

C 应用程序因分段错误而崩溃,c,rm,C,Rm,我知道这个错误意味着什么,但我看不出我做错了什么。我实现了一个删除文件和目录的功能,我还想为“rm”命令实现“-I”功能。使用的命令:rm-i文件名 有人问我是否要删除它,我键入“y”,我要删除的文件被删除,但程序随后崩溃,我不知道为什么 int has_args(char * argv[], char arg[]) { int i = 0; while(argv[i] != NULL) { if(strcmp(argv[i], arg) == 0) {

我知道这个错误意味着什么,但我看不出我做错了什么。我实现了一个删除文件和目录的功能,我还想为“rm”命令实现“-I”功能。使用的命令:rm-i文件名

有人问我是否要删除它,我键入“y”,我要删除的文件被删除,但程序随后崩溃,我不知道为什么

int has_args(char * argv[], char arg[])
{
    int i = 0;

    while(argv[i] != NULL) {

        if(strcmp(argv[i], arg) == 0) {
            return 1;
        }
        i++;
    }
    return 0;
}

void print_error(char *this, char *filename)
{
    fprintf(stderr, "%s: Could not delete file: %s;\n%s\n", this, filename, strerror(errno));
}

int cmd_rm(int argc, char *argv[])
{
    errno = 0;

    if(argc > 1) {
        if(has_args(argv, "-r")) {
            remove_directory(argv[2]);
        }
        else if(has_args(argv, "-i")) {

            char ans[2];

            fprintf(stdout, "Delete file: '%s'?\n", argv[2]);
            scanf("%s", ans);
            trim(ans);

            if((ans[0] == 'Y') || (ans[0] == 'y')) {

                if(remove(argv[2])) {
                    print_error(argv[0], argv[2]);
                }    
            }
        }
        else {
            if(remove(argv[1])) {
                print_error(argv[0], argv[1]);
            }
        }
    }
    else {
        puts("ERROR: ");
        print_usage(argv[0]);
    }

    return 0;
}

为什么不试试
scanf(“%c”和&ch)y
n
,则回答为code>,但是如果您希望支持
yes
no
,则可以编写以下代码:

scanf("%1,3s",ans); /* Points out that the minimum length is 1 and the maximum length is 3 */
正如其他人指出的,在某些情况下,
cmd_rm()
函数应返回
1
或任何其他值,以指示文件删除成功。但是,我看不到您的函数
cmd_rm()
中有任何成功的例子,如果您将
trim
函数封装起来会更好


但是一般来说,
分段错误
是因为指针没有指向正确的位置(棘手的指针)。调试器可以方便地找到这些指针

什么是
具有_args()
?为什么假设第二个参数是
-i
,而不是第一个?因为-i永远是第二个参数。第一个是“rm”,第二个是“-i”,第三个是我要删除的文件。但是你不能保证这一点,如果它总是存在,那么检查就没有意义了。你所做的毫无意义。只需遍历
argv
数组并检查它是哪个选项。好吧,我检查它是什么:它可以是“-r”,也可以是“-I”或什么都不是。但这是它的工作方式。稍后我将对此进行修改,但我的问题是,为什么它在成功删除我的文件后崩溃?您应该使用循环遍历命令行参数'int I;对于(i=1;icharans[256]分段错误的问题,所以当你想得到
y
n
作为答案时,你需要将ans定义为
charANS。然后传递到
scanf
as
scanf(“%c”和&ans)