La función del sistema en c no funciona para mí

Estoy utilizando este código para extraer un archivo RAR protegido por contraseña. Estoy usando la función std::system() para invocar el comando RAR. Si uso la password en la función std::system() , funciona. Pero como intenta pasar la contraseña como parámetro, no lo hace. Por ejemplo, si en este código si uso la contraseña pwd , da este error:

“pwd no se reconoce como comando interno o externo, progtwig ejecutable o archivo por lotes”.

Pero si cambio el código y lo hago al system("rar e -ppwd wingen.rar") , funciona.

¿Alguien puede explicar qué error estoy cometiendo? ¡Gracias por adelantado!

Aquí está mi código:

 #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; } 

La función del system() no funciona como printf() . Debe crear la cadena completa y luego llamar al system() :

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

El código que tiene ahora está utilizando el operador de coma, lo que hace que su progtwig ignore completamente su ‘cadena de formato’. Lo que tienes allí es 100% equivalente a escribir:

 system(pword); 

Lo que presumiblemente no es lo que querías.

system() solo toma un argumento – un const char* . De hecho,

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

no comstackrá: el comstackdor se quejará de que has pasado demasiados argumentos a system() . La razón que:

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

comstackr es que has envuelto tus dos cadenas entre paréntesis. Esto tiene el efecto de evaluar la expresión interior, que consiste en que el operador de coma opera en dos cadenas. El operador de coma tiene el efecto de devolver el valor del segundo argumento, por lo que terminas llamando:

 system( pword ); 

Lo que en tu ejemplo es equivalente a:

 system( "pwd" ); 

Y pwd no es un comando en su sistema (aunque en sistemas POSIX lo es … pero estoy divagando). Lo que quieres hacer se ha explicado en las otras respuestas, pero, para completar, lo mencionaré también. sprintf formatear tu cadena usando sprintf :

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

o puedes concatenar cadenas, lo que podría ser un poco más rápido (aunque para una cadena tan corta, probablemente no haga una diferencia):

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

La función system () recibe una cadena como argumento.

Su prototipo es:

 int system(const char *command); 

Construye la cadena antes de pasarla. Utilice snprintf () tal vez.

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

EDITAR :
Todas estas soluciones son malas ideas, ya que existe una vulnerabilidad de inyección con el uso de un sistema con información no desinfectada.

Incluso si usa snprintf como con mi respuesta, o strcat como el otro, todavía hay un problema ya que system() (al menos con /bin/sh en * nix systems) puede ejecutar varios comandos con una sola función de llamada.

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

se obtendría de

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