应用程序崩溃与分段错误

时间:2016-01-17 15:52:58

标签: c rm

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

我被问到是否要将其删除,我输入“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;
}

1 个答案:

答案 0 :(得分:0)

如果用户只能输入scanf("%c",&ch);y,为什么不尝试n作为答案,但是如果您想支持yes或{{ 1}}您可以编写以下代码:

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是因为指针没有指向正确的位置(棘手的指针)。调试器可以很方便地找到这些指针。