PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Argumente parsen



Bluescreen
07.02.2010, 19:18
Abend.
Ich bin PHP Entwickler, und habe mich bei einer kleinen Aufgabe gedacht, "das Skript kann ich doch in C++ schreiben".
Es lief überraschend gut, natürlich hab ich auch nur ein ganz einfaches Problem, für das ich nicht zb. mit Pointern arbeiten muss, ich aber doch ganz gern mit C++ die volle Power aus einem Programm hauen wollte.

Was ich nicht schaffe, ist das Argumente der Kommandozeile (Linux) parsen.

Aufruf:
./program -n 15

Ausgabe:
n:2-15;



#include <iostream>
#include <string>
#include <sstream>
using std::string;

unsigned char digitMiddle = '2';
unsigned char digitFill = '1';
unsigned short digitRepeat = 1;
unsigned int maxChecks = 100;
bool abortOnSuccess = true;

//...

int main(int argc, char* argv[]) {
register unsigned int i; //steps

//parse args
i = 1;
while ((i < argc)) {
register string sw = argv[i]; //ein Argument
if (sw=="-n") {
std::stringstream sstr(argv[i]+1);
sstr >> numberInt;
std::cout << "n:" << digitMiddle << "-" << argv[i+1] << ";";
} else if (sw=="-f") {
//...
}
i++;
}
//end of parse args


return 0;
}



Das Argument von n wird zum Integerwert 2 umgewandelt, sollte 15 sein. Was ist falsch, oder wie sollte ich besser die Argumente parsen? Grüße

Mog
07.02.2010, 19:21
unistd.h ansehen, oder glibmm verwenden.

http://www.gnu.org/s/libc/manual/html_node/Getopt.html

Bluescreen
07.02.2010, 20:12
http://www.gnu.org/s/libc/manual/html_node/Getopt.html
Mhmm, funktioniert noch nicht ganz. -f wird als invalide Option geführt:

//parse args
int c;
while ((c = getopt (argc, argv, "abc:")) != -1)
switch (c) {
case 'f':
digitRepeat = (int) optarg;
break;
case 'm':
digitMiddle = (int) optarg;
break;
case 'a':
abortOnSuccess = false;
break;
case '?':
if (optopt == 'c')
fprintf (stderr, "Option -%c requires an argument.\n", optopt);
else if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
// default:
//
}
//end of parse args

Aufruf:
./primenumber -f 15
./primenumber: invalid option -- 'f'
Unknown option `-f'.

Mog
07.02.2010, 20:52
getopt (argc, argv, "abc:")

Lies dir mal das Man bez. des letzten parameters durch. ;)

Bluescreen
07.02.2010, 21:45
Okay. Allerdings werden die Werte nicht richtig umgewandelt!
Ich krieg sie nicht zum richtigen Integer. Wenn ich nicht caste, kann ich nicht kompiilieren, "Ungültige Umwandlung von char* in short unsigned integer".
Was ist zu tun?


//parse args
int c;
while ((c = getopt (argc, argv, "f:m::a::x::")) != -1)
switch (c) {
case 'f':
digitRepeat = optarg;
std::cout << "f" << optarg << "-" << digitRepeat << std::endl;
break;
case 'm':
digitMiddle = (int) optarg;
std::cout << "m" << digitMiddle << std::hehe:ndl;
break;
case 'x':
maxChecks = (int) optarg;
std::cout << "x" << maxChecks << std::hehe:ndl;
break;
case 'a':
abortOnSuccess = false;
break;
case '?':
if (optopt == 'c')
fprintf (stderr, "Option -%c requires an argument.\n", optopt);
else if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
// default:
//
}
//end of parse args


Edit:
Hier sind die Variablendefinitionen:
unsigned char digitMiddle = '2';
unsigned char digitFill = '1';Mit atoi kann ich nicht in Char umwandeln.

Mog
07.02.2010, 21:59
Char* in eine Zahl:
strtol + schranken checken. Siehe limits.h

atoi und co sind Boese, und sollten nicht verwendet werden.



In Cpp solltest du eher String nehmen, anstatt c-strings. Da ist + fuer int und co ueberladen, und du kannst einfach addieren.

Fuer char* selber gibt es printf und Freunde.

Bluescreen
07.02.2010, 23:16
Char* in eine Zahl:
strtol + schranken checken. Siehe limits.hOkay, ich verwende jetzt auch einen short int.


atoi und co sind Boese, und sollten nicht verwendet werden.Okay... Weil unzuverlässig?


In Cpp solltest du eher String nehmen, anstatt c-strings.Okay, den Unterschied erkenne ich an was?


Da ist + fuer int und co ueberladen, und du kannst einfach addieren.Mhmm... Kannst du das nochmal anders ausdrücken für mich?

Mog
08.02.2010, 01:50
Okay, ich verwende jetzt auch einen short int.

Okay... Weil unzuverlässig?

Okay, den Unterschied erkenne ich an was?

Mhmm... Kannst du das nochmal anders ausdrücken für mich?


Bitte versteh' mich jetzt nicht falsch, allerdings ist es eher anzuraten erst eine Sprache grundlegend aus Manuals zu lernen, als /alles/ einzeln zu erfragen.

Schau dir mal an was man mit Cpp so machen kann, und lerne die Datentypen kennen.

Danach koennen wir gerne weiter reden. ;) Es macht aber keinen Sinn, wenn du wirklich alles den Anderen aus der Nase ziehen musst. Wie es scheint, ist es naemlich nicht nur das cmd-parsen, was dir Probleme bereitet.

Bluescreen
09.02.2010, 21:31
Hey, ich will mich ja morgen nicht C++ Entwickler nennen.
Ich will nur die geballte Kraft der Rechenleistung eines Computers für diese Aufgabe nutzen. Der Rest des Programms ist kein Problem, scho ferdig. Nur das Argumente parsen wär g*** gewesen.

Es ist nur ein Ausflug (zu C++).