C 应用程序因分段错误而崩溃
我知道这个错误意味着什么,但我看不出我做错了什么。我实现了一个删除文件和目录的功能,我还想为“rm”命令实现“-I”功能。使用的命令:rm-i文件名 有人问我是否要删除它,我键入“y”,我要删除的文件被删除,但程序随后崩溃,我不知道为什么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) {
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]我尝试像您一样进行扫描,但在编译时收到警告:“格式“%c”要求参数类型为“char”,但参数2的类型为“char()[256]”你可以调试并把所有函数定义放在这里,这样我们就可以帮助你了。我想在你的这段代码中没有分段错误的问题,所以当你想得到y
或n
作为答案时,你需要将ans定义为charANS代码>。然后传递到scanf
asscanf(“%c”和&ans)代码>