Programmaufruf über einen String ???



  • Ich habe folgendes Problem: Ich lese aus einer Externen Datei einen Sting ein. Dieser String entspricht einem im Programm existierenden namen. Wie kann ich jetzt nur anhand des eingelesenen Strings das entsprechenden Programm aufrufen ?

    Ich will quasi ein programm Schreiben, dem man einen char*... übergibt und der daraus ein entsprechendes Programm aufruft.

    hat da jemand eine Idee wie man das lösen könnte ?



  • #include <stdlib.h>
    int main(int argc, char* argv[])
    {
        if(argc == 2)
            return system(argv[1]);
        return 1;
    }
    

    Meinst du so was?



  • #include <stdlib.h>
    
    char *comlin;
    int   exit_val;
    
    exit_val=system(comlin);
    

    comlin ist die befehlszeile so wie man sie auf der konsole eingeben würde.
    exit_val ist der rückgabewert der programms. also der return wert der funktion main(). oder das argument von exit(), falls das programm damit beendet worden ist.

    http://www.openbsd.org/cgi-bin/man.cgi?query=system&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html



  • Return Value

    If command is a NULL pointer, system returns nonzero if a command processor is available.

    If command is not a NULL pointer, system returns 0 if the command processor was successfully started.

    If an error occurred, a -1 is returned and errno is set to one of the following:

    ENOENT Path or file function not found
    ENOEXEC Exec format error
    ENOMEM Not enough memory

    😃



  • Ich habe folgendes konstrukt:

    fscanf("test.txt","%s",funktionsname);

    und jezt möchte ich die Funktion funktionsname auf rufen, die ich aus der
    Textdatei test.txt eingelesen habe



  • Geht nicht. Zur Laufzeit haben deine Funktionen keine Namen mehr, nur noch Adressen. Das Problem lässt sich sicher umgehen. Ansonsten würd ich es in c++ mal mit einer Map aus Funktionspointern und Strings versuchen.



  • könnte man nicht den eingelesen string, der den funktionscode enthält, wie einen
    shellcode behandeln und ausführen?



  • Naja das müsste schon irgendwie gehen, sonst würde uns unser Info. Prof. die Aufgabe ja wohl nicht stellen !?



  • Willst du nun eine FUNKTION aufrufen oder ein PROGRAMM? Einmal redest du davon, dann wieder davon. Wie das mit dem Programm geht steht doch schon oben.



  • ich gebe mal ambesten ein Bsp.
    _____________________________________________________________
    #include <stdio.h>

    int max(char* zahlen); //Funktion wandelt String in int zahlen und bestimmt max wert
    int min(char* zahlen); //Funktion wandelt String in int zahlen und bestimmt min wert

    void main()
    {
    char funktionsname[30];
    char zahl[10];
    FILE* datei;
    datei=fopen("test.txt","r");
    fscanf(datei,"%s %s",funktionsname,zahl);
    }
    _____________________________________________________

    Die datei test.txt sieht z.b so aus:

    max 12356
    max 44566779
    min 3479

    und ich will jetzt das eben je nach erstem string in der Text datei entweder die funktion max oder die Funktion min aufgerufen wird. und man mit einer for schleife eben die gesammte datei abarbeiten kann, und das quasi jedesmal individuell durch die text datei die entsprechen anzuwendende Funktion angebeben wird.



  • So direkt geht das nicht. Du musst irgendwo etwas festlegen dass du den string "max" mit der funktion max() assoziieren kannst, ich würde das über ein Strukturarray aus Funktionspointern und char* machen. Dann nach dem einlesen des Strings linear durch das Array suchen und sobald man die passende Funktion hat diese ausführen.



  • kurz: Du musst abfragen, was eingegeben wurde und daran entscheiden, welche Funktion du aufruft.

    Außerdem ist da wohl noch viel lernen bei dir nötig, auf so eine Idee wie du sie im Kopf hattest kann man nur kommen, wenn man noch nichts verstanden hat.



  • für mich hört sich das nach ner simplen einlese, vergleiche, aufrufe aufgabe an.
    "max" oder "min" einlesen + zahl einlesen und jenachdem, was strcmp liefert max() oder min() aufrufen.



  • @ mahlzeit:

    Was heißt bitte die Idee die ich im Kopf hatte. 😡

    Diese Idee habe ich weiterhin im Kopf. Ich bin schließlich
    nur auf der suche nach einer möglichkeit eine große anzahl von unterschiedlichen Funktionsaufrufen
    über eine individuelle Textdatei zu steuern.



  • curry-king schrieb:

    für mich hört sich das nach ner simplen einlese, vergleiche, aufrufe aufgabe an.
    "max" oder "min" einlesen + zahl einlesen und jenachdem, was strcmp liefert max() oder min() aufrufen.

    Das klingt glaube ich ganz gut. Da hätte ich aber eigentlich auch selbst draufkommen müssen. 😕

    Werde das ganze mal in die tat umsetzten und schauen ob es so funktioniert wie ich mir das vorstelle.
    Danke für die tipps



  • FireFlow schrieb:

    Return Value

    If command is a NULL pointer, system returns nonzero if a command processor is available.

    If command is not a NULL pointer, system returns 0 if the command processor was successfully started.

    If an error occurred, a -1 is returned and errno is set to one of the following:

    ENOENT Path or file function not found
    ENOEXEC Exec format error
    ENOMEM Not enough memory

    😃

    Ich quote hier mal den Standard, das sollte Aufklärung schaffen;

    If the argument is a null pointer, the system function returns nonzero only if a command processor is available. If the argument is not a null pointer, and the system function does return, it returns an implementation-defined value.

    Stichwort "implementation-defined"...



  • Um funktionalitäten in einem Programm aus einer Datei auftzurufen versuchs mal mit folgendem:

    int fkt_max(char *argument);
    {
    // Bearbeiten der Argumente
    // Ausführen der Operation
    .....
    }
    
    typedef struct
    {
       const char *kwd;        /* Speicher für Funktionsnamen */
       int (*action)(char *);  /* function to be executed */
    } DFunKey;
    
    DFunkey funktions[]={
        {"MAX",fkt_max},
        {"MIN",fkt_min},
        {"",NULL},
    };
    int AnzElem=(sizeof(funktions)/sizeof(DFunKey));
    

    in deiner Auswerte Routine
    -liest du mit fgets eine Zeile,
    -trennst den Funktionsnamen ab
    -entfernst davon alle whitespace Characters
    -durchsuchst linear mit strcmpi das feld funktions
    -im Trefferfall rufst du die Funktion auf
    -falls das Kommando im Feld nicht vorkommt rufts du eine Fehlerroutine auf

    Willst du es intelligenter machen sortiert du das feld mit den zulässigen
    Namen linear aufsteigend und machst dann eine Newton Suche daruf, diese
    Braucht im Mitt für 2^n Einträge n Zugriffe im Gegensatz zum linearen Search
    mit n/2 Zugriffe bei n Elementen.

    Viel Spaß.



  • kruemel-monster schrieb:

    @ mahlzeit:

    Was heißt bitte die Idee die ich im Kopf hatte. 😡

    So wie du es verwirklichen wolltest meinte ich. Das war nunmal totaler Käse.


Anmelden zum Antworten