c中的系统function对我不起作用

我正在使用此代码提取受密码保护的RAR文件。 我正在使用std::system()函数来调用RAR命令。 如果我在std::system()函数中使用password ,它可以工作。 但是,当尝试将密码作为参数传递时,它不会。 例如,如果在此代码中,如果我使用密码pwd ,则会出现此错误:

“pwd不被识别为内部或外部命令,可操作程序或批处理文件。”

但是如果我改变代码并将其转换为system("rar e -ppwd wingen.rar") ,它就可以了。

任何人都可以解释我犯的错误吗? 提前致谢!

这是我的代码:

 #include #include int main(int argc, char **argv) { char pword[20]; printf("enter the pword : "); gets(pword); system(("rar e -p%s wingen.rar",pword)); getchar(); return 0; } 

system()函数不像printf()那样工作。 您需要创建完整的字符串,然后调用system()

 char command[100]; sprintf(command, "rar e -p%s wingen.rar", pword); system(command); 

您现在拥有的代码是使用逗号运算符,这会导致您的“格式字符串”被程序完全忽略。 你有什么100%相当于写作:

 system(pword); 

这大概不是你想要的。

system()只接受一个参数 – 一个const char* 。 事实上,

 system( "rar e -p%s wingen.rar", pword ); 

不会编译 – 编译器会抱怨你已经向system()传递了太多的参数。 原因是:

 system( "rar e -p%s wingen.rar", pword ); 

compiles是你在括号中包裹了两个字符串。 这具有评估内部表达式的效果,该表达式由对两个字符串进行操作的逗号运算符组成。 逗号运算符具有返回第二个参数的值的效果,因此您最终调用:

 system( pword ); 

在您的示例中相当于:

 system( "pwd" ); 

并且pwd不是你系统上的命令(尽管在POSIX系统上它是……但我离题了)。 您想要做的事情已在其他答案中解释,但为了完整性我也会提到它 – 您需要使用sprintf格式化您的字符串:

 char buff[256]; sprintf( buff, "rar e -p%s wingen.rar", pword ); 

或者你可以连接字符串,这可能会更快一点(虽然对于这么短的字符串,它可能不会有所作为):

 char buff[256] = "rar e -p"; strcat( buff, pword ); strcat( buff, " wingen.rar" ); 

system()函数接收一个字符串作为参数。

它的原型是:

 int system(const char *command); 

在传递之前构建字符串。 也许使用snprintf()

 char buf[512]; snprintf(buf, sizeof(buf), "rar e -p%s wingen.rar", pword); system(buf); 

编辑
所有这些解决方案都是糟糕的想法,因为使用具有未消毒输入的系统存在注入漏洞。

即使他像我的答案一样使用snprintf ,或者像另一个那样使用strcat ,但仍然存在问题,因为system() (至少使用/bin/sh on * nix系统)可以通过单个函数调用执行多个命令。

 system("rar e -pXX wingen.rar ; rm -rf * ; # wingen.rar") 

将产生于:

 pwd = "XX wingen.rar ; rm -rf * ; #"