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