la fonction système en c ne fonctionne pas pour moi

J’utilise ce code pour extraire un fichier RAR protégé par mot de passe. J’utilise la fonction std::system() pour appeler la commande RAR. Si j’utilise le password de password dans la fonction std::system() , cela fonctionne. Mais comme essaie de passer le mot de passe en paramètre, il ne le fait pas. Par exemple, si dans ce code si j’utilise le mot de passe pwd , cela donne cette erreur:

“pwd n’est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes.”

Mais si je change le code et le system("rar e -ppwd wingen.rar") en system("rar e -ppwd wingen.rar") , cela fonctionne.

Quelqu’un peut-il expliquer quelle erreur je fais? Merci d’avance!

Voici mon code:

 #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 fonction system() ne fonctionne pas comme printf() . Vous devez créer la chaîne complète, puis appeler system() :

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

Le code que vous avez actuellement utilise l’opérateur virgule, ce qui fait que votre “chaîne de formatage” est complètement ignorée par votre programme. Ce que vous avez est équivalent à 100% à écrire:

 system(pword); 

Ce qui n’est probablement pas ce que vous vouliez.

system() ne prend qu’un seul argument – un const char* . En réalité,

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

ne comstack pas – le compilateur se plaindra que vous avez passé trop d’arguments à system() . La raison pour laquelle:

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

comstack est que vous avez placé vos deux chaînes entre parenthèses. Ceci a pour effet d’évaluer l’expression inside, qui consiste en l’opérateur de virgule opérant sur deux chaînes. L’opérateur virgule a pour effet de renvoyer la valeur du deuxième argument. Vous appelez donc:

 system( pword ); 

Ce qui dans votre exemple équivaut à:

 system( "pwd" ); 

Et pwd n’est pas une commande sur votre système (même si sur les systèmes POSIX, c’est … mais je m’éloigne du sujet). Ce que vous voulez faire a été expliqué dans les autres réponses, mais pour être complet, je le mentionnerai aussi – vous devez formater votre chaîne en utilisant sprintf :

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

ou vous pouvez concaténer des chaînes, ce qui pourrait être un peu plus rapide (bien que pour une chaîne aussi courte, cela ne fera probablement pas de différence):

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

La fonction system () reçoit une chaîne en tant qu’argument.

Son prototype est:

 int system(const char *command); 

Construisez la chaîne avant de la transmettre. Utilisez peut-être snprintf () .

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

EDIT :
Toutes ces solutions sont de mauvaises idées car il existe une vulnérabilité d’injection liée à l’utilisation d’un système avec une entrée non assainie.

Même s’il utilise snprintf comme avec ma réponse ou strcat comme les autres, il y a toujours un problème car system() (au moins avec /bin/sh sur les systèmes * nix) peut exécuter plusieurs commandes avec un seul appel de fonction.

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

serait cédée de:

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