Kommandozeilenargumente



  • Hi,

    was ist eigentlich der genaue unterschied zwischen:

    int main (int argc, [b]char*[/b] argv)
    

    und

    int main (int argc, [b]char**[/b] argv)
    

    Desweiteren, wenn ich nun die Stringlänge von argv prüfen will (muss ich mit Konvertierung von string zu integer machen), kommen Fehlermeldungen da ich nicht char** in char* konvertieren kann und dann noch char* zu int.

    Ich sach ma vielen Dank im voraus.

    mfg Blue



  • bei ersterem ist argv ein zeiger auf char [und main dadurch nicht iso-konform] (aka C-string)
    zweiteres macht argv zu einem zeiger auf char-zeiger, oder -übersetzt- zu einem zeiger auf C-strings (man beachte die mehrzahl)
    ein abschließendes beispiel zur veranschaulichung:

    int main (int argc, char ** argv)
    {
       for (int i = 1; i < argc; ++i) cout << i << ". argument: " << argv[i] << endl; //achtung, argv[0] ist der "name" des programs
    }
    

    gibt für den aufruf

    programm -a -v -p blub
    

    aus:

    1. argument: -a
    2. argument: -v
    3. argument: -p
    4. argument: blub
    

    was willst du weiters tun?



  • Hi,
    danke für die Antwort. Nun will ich noch prüfen, was im argv enthalten ist, was dem Programm übergeben wurde.

    z.B. programmname 5 13 23 aa

    Hierbei soll alles was größer wie z.B. 20 nicht berücksichtigt werden, bzw. Fehlerausgabe, genauso wie 05.
    Dies sollte über Konvertierung von string zu integer erfolgen.

    char c = '1';
    int i = c -'0';
    

    das geht auch soweit, nur nicht mit 2-stelligen zahlen und nicht mit char** argv wegen der convertierung von char** nach char* bzw. char und von char nach int.



  • Servus BlueBoy1981!

    Ich meine in der FAQ gibts dazu schon einen Thread. Ansonsten kannst du es mit dieser Funktion probieren.

    // Funktion strToL(const std::string&) - konvertiert Zahlen aus einem String zu einem long Datentyp. 
            // Parameter: String vom Typ string, welcher die zu konvertierenden Zahlen enthaelt. 
            // Return Wert: 0 wenn Konverterungsfehler, ansonsten konvertierte Zahl vom Typ long.
            long strToL(const std::string& str)
            {
                    unsigned int i;
                    bool negative = false;
                    long number = 0;
    
                    for(i = 0; i < str.length() && std::isspace(str[i]); i++)
                            ;
    
                    if(str[i] == '-')
                    {
                            negative = true;
                            ++i;
                    }
                    for(unsigned int j = i; j < str.length(); ++j)
                            if(!std::isdigit(str[j]))
                                    return 0;
    
                    for( ; i < str.length(); i++)
                            number = number * 10 + (str[i] - '0');
    
                    if(negative)        
                            return (number * (-1));
                    else
                            return number;                        
            }
    

    wenn du jetzt dein Programm so aufrufst:

    programm.exe 12345
    

    und der Funktion als Argument argv[1] übergibst, sprich

    long val = strToL(argv[1])
    

    sollte deine Zahl eigentlich korrekt umgewandelt werden.

    Caipi



  • so zb

    int main (int argc, char ** argv)
    {
       for (int i = 1; i < argc; ++i) 
       {
          long l;
          if (stringstream(argv[i])>>l)
             if (l <= 20) cout << "! " << l << endl;
       }
    }
    

    oder du verwendest strtol (aus cstdlib)

    int main (int argc, char ** argv)
    {
       for (int i = 1; i < argc; ++i) 
       {
          long l; char ** valid;
          l = strtol(argv[i], valid, 10); //basis 10
    
          if (*valid != argv[i])
             if (l <= 20) cout << "! " << l << endl;
       }
    

    oder boost::lexical_cast oder ...
    Schau mal zu den FAQs


Anmelden zum Antworten