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. P> p>
3 Réponses :
Construire la chaîne Vous passez à System () Code> avec un StringStream!
@ninjalj: Donc, nous savons que l'utilisation de System () code> 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 () code> 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.
Votre problème découle du fait que Ce que vous avez, c'est de type Un moyen de résoudre ce problème est de construire un nouveau puis transmettez le contenu au système code>. p> système code> est de signature: p>
std :: string code>. P>
std :: string code> puis obtenir le Pointeur de caractère utilisant
c_str () code>. p>
system(cmd.c_str());
Ne sont pas système code> CALS identique à la numération de la commande dans cmd.exe?
@Xeo: Yup et si vous avez passé FOO & FIRE_NUKES.EXE & REM CODE> à 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.
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: 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. P> P>
Je trouve plus propre à ajouter un système Système Int (STD :: String Const & S) {retour S.C_STR (); } code> surcharge.
@Msalters, avez-vous voulu dire int system (STD :: String Const & S) {Système de retour (S.C_STR ());} code>? Oui, ça ressemble à une bonne idée.
@ninjalj, la question portait sur comment i> 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.
Downvoted parce que passe de variables à
System () code> est activement dangereux b>. Utilisez
SPAWN () CODE> ON WIN32,
FORK () / EXEC () CODE> ou
POSIX_SPOWN () CODE> 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.