2009-08-02 15 views
0

J'apprends le C++ et développe un projet à pratiquer, mais maintenant je veux transformer une variable (String) en code, comme ça, l'utilisateur a un fichier qui contient du code C++, mais je veulent que mon programme lit ce fichier et l'insérer dans le code, comme ceci:Convertir une chaîne en code C++

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 
using namespace std; 
int main(int argc, char* argv[]) 
{ 
    ifstream file(argv[ 1 ]); 
    if (!file.good()) { 
     cout << "File " << argv[1] << " does not exist.\n"; 
     return 0; 
    } 
    string linha; 
    while (!file.eof()) 
    { 
    getline(file, linha); 
    if (linha.find("code") != string::npos) 
     { 
      size_t idx = linha.find("\""); //find the first quote on the line 
      while (idx != string::npos) { 
      size_t idx_end = linha.find("\"",idx+1); //end of quote 
      string quotes; 
      quotes.assign(linha,idx,idx_end-idx+1); 
      // do not print the start and end " strings 
      cout << quotes.substr(1,quotes.length()-2) << endl; 
      //check for another quote on the same line 
      idx = linha.find("\"",idx_end+1); 
      } 
     } 
    } 
    return 0; 
} 

et voici un fichier exmaple:

code "time_t seconds;\n seconds = time (NULL);\n cout << seconds/3600;" 

Mais quand je lance le programme, il ne Covert la chaîne dans le code, mais il imprime exactement ce qui est dans les citations.

Merci!

Répondre

3

Vous faites cout juste? Donc, évidemment, il est affiché.

Peut-être ce que vous essayez de faire est une injection de code dans un processus en cours comme celui-ci http://www.codeproject.com/KB/DLL/code_injection.aspx

+0

Mais comment je peux le faire sans cout, faire une injection de code. Merci! –

+0

avec mon code qui est dans la question! –

5

C++ est un langage compilé, pas un langage interprété. Par conséquent, il n'est pas possible qu'un programme lise le code C++ à la volée et l'exécute, puisque ce code doit être compilé.

+6

Vous perdez votre temps avec ce type. –

+2

Neil, je pense souvent la même chose, mais d'un autre côté, certaines personnes n'apprendront pas les choses si vous ne les expliquez pas - et gaspilleront beaucoup plus de temps et d'autres à ce moment-là. – schnaader

+0

Jetez un oeil à ses messages précédents. Certains d'entre nous ont essayé, mais pour ma part j'ai donné. –

1

Qu'est-ce que vous voulez est réellement évaluer la chaîne à l'exécution. Cela n'est pas directement pris en charge dans C++ ou dans d'autres langages non interprétés/jitted.

1

Vous ne pouvez pas faire ce que vous voulez en C++. Pour évaluer les arguments de la ligne de commande, vous devez intégrer un langage de script dans votre programme (Python semble être un bon exemple - ce n'est pas difficile). L'argument chaîne peut être évalué en tant que code Python.

0

Si l'objectif est d'exécuter un script fourni de l'extérieur, je suggère que le script soit spécifié comme l'un des langages de script couramment utilisés. Nous l'avons fait avec perl il y a plusieurs années. Cette link text décrit comment. Bien que la compilation et la liaison dynamiques du code C++ soient techniquement possibles, il est assez difficile et le résultat n'est peut-être pas trop robuste - pensez à quel point l'auteur "script" peut mal utiliser un pointeur.

Les langages de script ont tendance à être plus traitable que C++ pour moins auteurs techniques

0

Comme d'autres ont noté que C++ est généralement un langage compilé, et fournit tout simplement pas de support natif pour cela.

Deux solutions possibles à la question que vous lui demandez:

  • trouver et utiliser un interpréteur de C++. Il existe plusieurs questions sur StackOverflow, et au moins deux de ces logiciels existent. Je préfère cint.
  • Appelez un compilateur C++ sur le code pour générer une bibliothèque dynamique que vous chargez et appelez par la suite. Ce ne sera pas exactement comme votre exemple, mais dans le cas où l'utilisateur doit fournir un code "appelable" (c'est-à-dire une ou plusieurs fonctions).

solution possible à la question que vous a peut-être signifié:

  • Utilisez un langage d'extension un python, tcl ou lua.
Questions connexes