Ergebnis 1 bis 9 von 9

Thema: [C++] Argumente parsen

  1. #1

    [C++] Argumente parsen

    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;

    Code:
    #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

  2. #2
    unistd.h ansehen, oder glibmm verwenden.

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

  3. #3
    Mhmm, funktioniert noch nicht ganz. -f wird als invalide Option geführt:
    Code:
      //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'.

  4. #4
    getopt (argc, argv, "abc:")

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

  5. #5

    Umwandlung scheitert

    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?

    Code:
      //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:
    Code:
      unsigned char		digitMiddle = '2';
      unsigned char		digitFill = '1';
    Mit atoi kann ich nicht in Char umwandeln.

    Geändert von Bluescreen (07.02.2010 um 20:55 Uhr) Grund: Neue Hinweise

  6. #6
    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.

  7. #7
    Zitat Zitat von Mog Beitrag anzeigen
    Char* in eine Zahl:
    strtol + schranken checken. Siehe limits.h
    Okay, ich verwende jetzt auch einen short int.

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

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

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

    Geändert von Bluescreen (07.02.2010 um 22:23 Uhr)

  8. #8
    Zitat Zitat von Bluescreen Beitrag anzeigen
    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.

  9. #9
    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++).

    Geändert von Bluescreen (09.02.2010 um 20:56 Uhr) Grund: Verdeutlichung

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •