Kommandoargumente
-
Hy,
viele von euch kennen doch sicherlich werkzeuge wie wc, ls etc.
man kann dem werkezug ein argument übergeben:ls -a zum beispiel.
wie kann ich am besten so ein '-a' implementieren?
if (argv[2] == '-h' || '--help') { /* tu was */ }
auch wenn mein bsp nicht unbedingt geht, wie gehts richtig?
-
argv[Index] ist vom Typ char* . Daher musst du zum vergleichen strcmp benutzen.
Und immer an die Überprüfung von argc denken- sonst gibts Fehler
-
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 string20 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 string20 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