Kommandoargumente



  • ich versuchs mit strcmp, aber wies aussieht isses so, dass wenn die strings gleich sind, die folgende anweisung NICHT ausgeführt wird.

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <cstdlib>
    
    using namespace std;
    
    void error_msg(const string& s)
    {
      cerr << "Foobar..." << s;
    }
    
    int syntax_parser(int argc, char* argv[]) 
    {
      if (strcmp(argv[1],"-h")) {
      cout << "Print Help...\n";
      }
    }
    
    int main(int argc, char* argv[])
    {
      syntax_parser(argc, argv);
    }
    


  • int strcmp ( const char * string1, const char * string2 );

    Compare two strings.
    Compares string1 to string2 character by character.
    This function starts comparing the first character of each string. If they are equal to each other continues with the following pair until the characters differ or until end of string is reached.

    Parameters.

    string1
    Null-terminated string to compare.
    string2
    Null-terminated string to compare.

    Return Value.
    Returns a value indicating the lexicographical relation between the strings:

    return value description
    <0 string1 is less than string2
    0 string1 is the same as string2

    0 string1 is greater than string2



  • was willste mir damit sagen? es geht nicht, sei doch so freaky und zeig mir bitte wies richtig geht.



  • hmm, lern lieber etwas

    schau dir den Code an

    int a=1;
    if(a)
      std::cout << "a\n";
    int b=0;
    if(b)
      std::cout << "b\n";
    

    und folgendes Zitat aus der strcmp Beschreibung

    return value description
    <0 string1 is less than string2
    0 string1 is the same as string2

    0 string1 is greater than string2



  • ok habs jetzt, if (strcmp(argv[1],"-h") == 0), so gehts.
    mein zweites problem ist, dass ich immer einen coredump bekomme, wenn ich als argument gar nix angebe.



  • acid phreak schrieb:

    ok habs jetzt, if (strcmp(argv[1],"-h") == 0), so gehts.
    mein zweites problem ist, dass ich immer einen coredump bekomme, wenn ich als argument gar nix angebe.

    int syntax_parser(int argc, char* argv[]) 
    { 
      if(argc==1)
         cout<<"da war gar kein kommandozeilenargument"<<endl<<"coredump folgt"<<endl;
      if (strcmp(argv[1],"-h")) { 
      cout << "Print Help...\n"; 
      } 
    }
    


  • geht trotzdem nicht, hier mein bisheriger code:

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <cstdlib>
    
    using namespace std;
    
    void error_msg(const string& s)
    {
      cerr << "Fehler: " << s;
    }
    
    int syntax_parser(int argc, char* argv[]) 
    {
      if (argc==1) error_msg("Zu wenig Kommandozeilenargumente.");
    
      if (strcmp(argv[1],"-h") == 0) {  cout << "Gleich"; }
    
    }
    
    int main(int argc, char* argv[])
    {
      syntax_parser(argc, argv);
    }
    


  • habs mal so gemacht, daß der coredump nicht angekündigt wird, sondern gleich auch vermieden.

    int syntax_parser(int argc, char* argv[]) 
    {
      if (argc==1) {error_msg("Zu wenig Kommandozeilenargumente.")}
      else
      if (strcmp(argv[1],"-h") == 0) {  cout << "Gleich"; }
    }
    


  • Sieht doch gut aus. Hast n paar zuviele Header, aber sonst ist alles ok.
    Rufst du das Programm richtig auf?



  • Okay, also ich hab nen neues Problem und da ich leider so ein schlechter Erzähler bin, zeig ich euch einfach mal meinen blöde Code (bin c++ noob). ich hoffe mal ihr könnt erkennen was ich vorhabe in dem codestückchen. ich bekomme wieder einen coredump.

    #include <iostream> 
    #include <fstream> 
    #include <string> 
    #include <cstdlib> 
    
    using namespace std; 
    
    void error_msg(const string& s) 
    { 
      cerr << "Error:\t" << s; 
    } 
    
    struct C_A { /* Diverse kommandozeilen Argumente */ 
      char* short_arg; 
      char* long_arg; 
    }; 
    
    C_A c_a[] = { 
      "-h", "--help" 
    }; 
    
    void syntax_parser(int argc, char* argv[]) /* test */ 
    { 
      C_A* foo; 
      if(argc == 1) 
        { 
          error_msg("Zu wenig Kommandozeilen Argumente\n"); 
        } 
    
      else 
        { 
          for ( int i = 1; i < argc; ++i) 
        { 
          for ( int x = 0; x < 10; ++x) 
            { 
              strcmp(argv[i], foo[x].short_arg); 
              cout << argv[i]; 
            } 
        } 
        } 
    
    } 
    
    int main(int argc, char* argv[]) 
    { 
      syntax_parser(argc, argv); 
    }
    


  • foo war ein zeiger, der nicht initialisiert war, also ins nirwana zeigte. in speicher, der coredumpt, wenn man ihn benutzt.

    oben geht es mit
    C_A* foo=&c_a;

    oder einfacher unten mit
    strcmp(argv[i], c_a[x].short_arg);



  • du bist ja ein richtiger schatz volkard, nu geht's



  • halt mom *g*, wieder core dump:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <cstdlib>
    
    using namespace std;
    
    void error_msg(const string& s) 
    {
      cerr << "Error:\t" << s;
    }
    
    struct C_A { /* Diverse kommandozeilen Argumente */
      char* short_arg;
      char* long_arg;
    };
    
    C_A c_a[] = {
      "-h", "--help"
    };
    
    void syntax_parser(int argc, char* argv[]) /* test */
    {
      if(argc == 1) 
        {
          error_msg("Zu wenig Kommandozeilen Argumente\n");
        }
    
      else if ((strcmp(argv[1], c_a[0].short_arg) == 0) || (strcmp(argv[1], c_a[1].long_arg) == 0))
        {
          cout << "klappt!";
        }
    
    }
    
    int main(int argc, char* argv[])
    {
      syntax_parser(argc, argv);
    }
    


  • ok ich blödmann, es muss natürlich c_a[0].long_arg heißen


Anmelden zum Antworten