programm gleich mit argumenten starten



  • hi,

    also ich wollte fragen wie man es hinbekommt, dass man den namen des programms eingibt (linux) und gleich dahinter die argumente, die der funktion übergeben werden sollen.

    bis jetzt siehts so aus:

    int main(int argc, char argv[]){

    test(argc, argv);
    cin.ignore();
    return 0;

    und die funktion dazu so:

    void test(int anzahl, char *argument){

    cout<<argument;

    schon mal danke(und bin natürlich c++anfänger)



  • richtig heißt es:

    int main(int argc, char* argv[])
    {
      for(int i=0;i<argc;++i) printf("%s\n",arcv[i]);
      return;
    }
    

    argv enthält ein Array von char-Pointern, die je auf einen der Kommandozeilen-Parameter verweisen (und argc enthält deren Anzahl).



  • hi, danke erstmal für die schnelle antwort!:)

    also ich habe vor ein programm zu schreiben was den inhalt zweier ordner miteinander vergleicht (mit diff -r). dazu soll das programm aufgerufen werden (linux) und gleich dahinter die beiden verzeichnisse angegeben werden.

    anschließend sollen die unterschiede in einer csv-datei gespeichert werden (aber das ist ja erstmal nicht das problem jetzt 🙂

    ich muss dazu sagen dass ich anfänger in c++ bin. darum bitte leich verständlich antworten 🤡

    ps: @cstoll: würdest du das ein bischen leichter schreiben 😕 wäre sehr nett



  • Wie? noch leichter?

    Also, nach Standard ist das da oben die Art, wie Kommandozeilen-Parameter nach C(++) übergeben werden - ein Array von char-Pointern (btw, der Name ist prinzipiell egal). Auf die einzelnen Elemente kannst du wie oben gezeigt direkt zugreifen.

    Mal ein Beispiel zum besseren Verständnis:
    Kommando-Aufruf:

    my_prog mein_verzeichnis_1 mein_verzeichnis_2 /xyz
    

    Füllung von argv (argc==3):

    i  argv[i]
    0  "my_prog" (evt. mit Pfad)
    1  "mein_verzeichnis_1"
    2  "mein_verzeichnis_2"
    3  "/xyz"
    4  NULL
    

    Um das jetzt zu einem neuen System-Kommando zusammenzubauen, kannst du die einzelnen Elemente in std::string's speichern und richtig verketten, z.B.:

    string arg1=argv[1];
    string arg2=argv[2];
    string cmd="diff -r "+arg1+" "+arg2;
    
    system(cmd.c_str());
    

    (alternativ kannst du auch man: popen nutzen, um die Rückgabe des diff-Befehls abzufangen und weiterzuverarbeiten.)



  • hey super!! 👍 👍 😮 😉 😃 🙂

    ich denke jetzt hab ich es begriffen. muss mich in c++ halt noch einarbeiten und mit solchen antworten geht das natürlich supi!

    also vielen dank
    scarvy



  • nächstes problem: 🙄

    char cmd="diff -r "+arg1+" "+arg2;

    mit diesem ausdruck wollte ich eigentlich cmd deklarieren, c++ will das aber nicht 😮 😕

    der compiler sagt nur:

    error: invalid operands of types `const char[9]' and `
    char[50]' to binary `operator+'

    😕 😕 😕 😕 😕 😕

    scarvy



  • char cmd[100]; // auf jeden fall gross genug
     sprintf( cmd, "diff -r %s %s", arg1, arg2);
    

    Kurt
    Sehe gerade das ist C++ und ausserem hat CStoll schon die Antwort gegeben.
    Sorry



  • scarvy schrieb:

    char cmd="diff -r "+arg1+" "+arg2;

    Lies dir mal die Typdefinitionen durch, die ich oben verwendet habe - char ist ein Einzelzeichen, string (genauer std::string) verwaltet Zeichenketten.



  • so, ich hab das jetzt so gemacht (und es funktioniert 😃 ):

    int main(int argc, char **argv){

    cout<<setfill('\n')<<setw(2)<<'\0';
    cout << "Folgende Verzeichnisse wurden miteinander verglichen:" << endl;
    for (int i=1; i<argc; i++)
    {
    cout << argv[i] << endl;
    }

    cout<<setfill('\n')<<setw(5)<<'\0';

    char arg0[50];
    char arg1[100];
    char arg2[100];

    strcpy(arg0, argv[0]);
    strcpy(arg1, argv[1]);
    strcpy(arg2, argv[2]);

    char cmd[150];
    sprintf( cmd, "diff -r %s %s", arg1, arg2);
    system(cmd);
    cin.ignore();
    return 0;

    }

    nun sollen noch die unterschiede in eine csv-datei geschrieben werden. muss ich mich mal jetzt schlau machen im netz 😉

    thx, scarvy

    ps: sieht das prog nicht toll aus 🤡



  • scarvy schrieb:

    ps: sieht das prog nicht toll aus 🤡

    So ein C und C++ - Mix finde ich gar nicht soooo schön.

    Jockel



  • Wie Jockel schon sagte, nutz lieber konsequent die C++-Möglichkeiten, wenn sie dir geboten werden (bei Strings brauchst du dich z.B. nicht darum kümmern, wieviel Platz du benötigst). Desweiteren ist in deiner Anwendung arg0 überflüssig (wird nur gefüllt und nicht weiter ausgewertet) und sprintf (wenn du es schon einsetzen mußt) könnte auch direkt auf den argv[]-Elementen lesen.



  • ach manno ist doch mein erstes sinnvolles programm in c.

    also nochmal:

    sieht es nicht toll aus 🤡



  • mhhh ja ich versteh schon weiss jetzt aber nicht wie das prog in rein c++ aussehen müsste. bin grad froh dass es überhaupt funktioniert.

    hatte es auch mit strings probiert hat aber irgendwie nicht geklappt?!?
    vieleicht hat der eine oder andere ja nochmal lust mich aufzuklären? 🤡 😕

    auf jeden fall schon mal vielen dank für die hilfe
    scarvy



  • Was passiert wenn du dem Programm keine Argumente übergibtst?



  • dann steht da:

    segmentation fault

    und dann kannste nochmal probiere:)



  • Du solltest am Anfang noch abfragen, ob überhaupt genug Argumente da sind:

    int main(int argc,char*argv[])
    {
      if(argc<2)
      {
        cout<<"bitte zwei Verzeichnisse zum Vergleich angeben!"<<endl;
        return 1;
      }
      //...
    }
    

    Auf diese Weise bekommst du auf jeden Fall eine sinnvollere Fehlermeldung als "Segmentation Fault" 😉 Oder du bietest dem Nutzer an der Stelle die Möglichkeit, die Verzeichnisnamen direkt anzugeben.



  • danke 👍 , hab die fehlermeldung eingebaut!

    thx für den hinweis



  • mhhhh finde im netz so auf die schnelle nichts über einen csv-export.
    habe vor die gefundenen änderungen halt in einer csv-datei zu speicher.

    würde mir da nochmal jemand helfen 🙄

    vielen dank
    scarvy



  • ob es da eine elegantere Version in C++ gibt, bin ich mir nicht sicher, aber mit

    FILE* ans=popen(cmd,"r");
    

    (anstelle des system()-Befehls kannst du dir die Rückgabe deines Befehls auf ein FILE legen und dann mit fscanf() selber abarbeiten.



  • Denke zuerst solltest du dich mal schlau machen wie du die Ergebnisse von diff in dein Programm importierst bevor du irgend etwas exportieren kannst.
    Kurt


Log in to reply