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 * ; #"