6
votes

Utilisation de variables dans System () Fonction C ++

xxx

et cela ne fonctionne pas! J'ai aussi essayé ligne.c_str (); Mais cela ne fonctionnait pas non plus. S'il vous plaît aidez-moi.


2 commentaires

Downvoted parce que passe de variables à System () est activement dangereux . Utilisez SPAWN () ON WIN32, FORK () / EXEC () ou POSIX_SPOWN () ON * NIX.


@ninjalj La sécurité du système n'a rien à voir avec la question. Chaque fois qu'il y a une question à faire avec le système (), une personne doit commenter la sécurité et parfois les personnes (comme vous) lavotez-la. Il ne contribue rien et ne clut que la page. La question était "comment" utiliser le système (), pas une question sur les meilleurs moyens de l'utiliser. "Utilisez quelque chose d'autre à la place" n'est pas un commentaire utile.


3 Réponses :


3
votes

Construire la chaîne Vous passez à System () avec un StringStream! XXX


2 commentaires

@ninjalj: Donc, nous savons que l'utilisation de System () est dangereuse si vous autorisez une entrée d'utilisateur arbitaciaire. Cela ne change pas le fait que l'OP souhaitait assembler l'entrée d'un fichier. Et si le fichier est protégé contre l'accès des utilisateurs? Et si cela se lit comme une base de données ou quelque chose? Nous ne savons pas et nous ne nous soucions pas, la sécurité fait partie de la responsabilité de l'OP. Ce n'est pas une raison pour un vote. Je pourrais supprimer le système System () appeler et indiquer uniquement la chaîne d'assemblage. Et maintenant?


Vous pouvez dire à l'OP d'utiliser une API où chaque argument est séparé et n'utilise pas une coquille sous-jacente pour analyser la ligne de commande.



11
votes

problème 1: strong>

Votre problème découle du fait que système code> est de signature: p> xxx pré>

Ce que vous avez, c'est de type std :: string code>. P>

Un moyen de résoudre ce problème est de construire un nouveau std :: string code> puis obtenir le Pointeur de caractère utilisant c_str () code>. p> xxx pré>

puis transmettez le contenu au système code>. p>

system(cmd.c_str());


2 commentaires

Ne sont pas système CALS identique à la numération de la commande dans cmd.exe?


@Xeo: Yup et si vous avez passé FOO & FIRE_NUKES.EXE & REM à son programme, il exécuterait Curl.exe alors tente d'exécuter Fire_nukes.exe. Il ressemblerait légèrement différent sur * Nix, mais l'idée est la même.



13
votes

Cela ne fonctionne pas car vous passez une chaîne C ++ à un système de fonction C (). c_str () peut aider, mais vous devez l'appliquer à la chaîne entière: xxx

comme indiqué dans les commentaires ci-dessous, le passage des variables aléatoires au système () peut être assez dangereux, de sorte que vous ne devriez donc pas Faites-le si vous savez exactement ce qu'il peut contenir. Si cela est fourni par l'utilisateur ou reçu du réseau, vous ne devriez probablement pas faire cela. Passez la chaîne via une sorte de fonction "Escape" ou utilisez SPAWN () / EXEC () / Quels que ce soit d'autre qui ne le transmet pas à la coquille.


4 commentaires

Je trouve plus propre à ajouter un système Système Int (STD :: String Const & S) {retour S.C_STR (); } surcharge.


@Msalters, avez-vous voulu dire int system (STD :: String Const & S) {Système de retour (S.C_STR ());} ? Oui, ça ressemble à une bonne idée.


@ninjalj, la question portait sur comment utiliser des variables dans un tel appel, non pas si c'est dangereux ou non. En fait, Sine Le gars lit la variable d'un fichier, non directement à partir de l'utilisateur ou du réseau, ce n'est pas nécessairement dangereux. Cela dépend de l'endroit où il a eu ce fichier. Si c'est un fichier temporaire généré par la même application et que ce n'est pas accessible à l'extérieur, je suppose que c'est bien. Bien que je conviens que j'aurais dû mentionner les dangers possibles.


Et maintenant que vous avez clairement averti des dangers du système (), j'ai supprimé le bowvote. À l'heure actuelle, cette question comporte environ 350 points de vue, nous ne voulons pas de devenir une ressource sur de mauvaises pratiques.