c中的系统功能对我不起作用

时间:2010-08-22 05:03:40

标签: c

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

  

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

但如果我更改代码并将其设为system("rar e -ppwd wingen.rar"),则可以正常运行。

有人可以解释我犯的错误吗?提前谢谢!

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
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;
}

3 个答案:

答案 0 :(得分:18)

system()只需要一个参数 - const char*。事实上,

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

将无法编译 - 编译器会抱怨您向system()传递了太多参数。原因是:

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

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

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" );

答案 1 :(得分:6)

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()(至少在* {1}}上有* nix系统)可以通过单个函数调用执行多个命令。

/bin/sh

将来自:

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

答案 2 :(得分:5)

system()功能不像printf()那样有效。您需要创建完整的字符串,然后调用system()

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

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

system(pword);

这可能不是你想要的。