使用stdlib.h中的system()函数在ac程序中使用'rm'命令

Hit*_*ani 3 c unix

我正在尝试使用rm主例程中的命令删除我已采用命令行参数的文件.该值存储在argv[2]我已尝试使用

system("rm argv[2]");

system("rm ./argv[2]");

system("rm $HOME/argv[2]");
Run Code Online (Sandbox Code Playgroud)

但它给我一个错误的说法

"cannot locate file argv[2]"

文件名存储在argv[2]我检查过的位置.

有人请指导我!

jsc*_*ier 15

为什么不使用removeunlink命令而不是system("rm ...")

remove(argv[2]); 要么 unlink(argv[2]);


system("rm ...")必须使用的情况下更新

如果你必须使用system("rm ..."),ZelluX说明你必须从中检索文件名是正确的argv[2].您可以argv[2]使用snprintfstrncpy检索字符串.使用限制输入大小的函数的变体是一个好主意,因为不能保证字符串的长度argv[2].

根据您的应用程序,您可能还需要调用stat来验证字符串argv[2]是否确实是文件,并可能限制文件类型.

例:

此示例调用stat以验证是否argv[2]为常规文件,并调用asprintf为缓冲区动态分配空间.

char *p;
struct stat st;

if (stat(argv[2], &st) == 0 && S_ISREG(st->st_mode))
{
    if (asprintf(&p, "rm %s", argv[2]) != -1)
    {
        system(p);
        free(p);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但在我看来,问题在于hitesh123不理解文字字符串和字符串变量之间的区别,并建议他使用另一个函数不会帮助他理解它:P (5认同)

Zel*_*luX 8

"rm ./argv [2]"中的"argv [2]"是一个文字字符串,如果要使用存储在argv [2]中的内容,则需要使用strcpy()或sprintf()来连接" rm ./"与字符串存储在argv [2]中.