Parameter auf Permutationen von aA0? prüfen



  • Hallo c-community,

    ich schreibe derzeit an einem Programm (Linux über Terminal) dem ich eine Option übergeben möchte die eine Permutation aus den Buchstaben a, A, 0 und ? sein soll. Also muss ich prüfen, ob "a", "aA", "a0", "a?", ... übergeben wurden (jedes Zeichen darf aber nur einmal vorkommen! aber auch weggelassen werden!). Wie mache ich dies am besten OHNE eine if-Anweisung die jede Permutation als Oder-Verknüpfung enthält?

    Nicht gewollt:

    if(string == "a" || string == "aA" || string = "a0" || ...
    

    MfG
    mirrowwinger



  • Eins vorweg: Was du suchst, nennt man nicht Permutationen. Permutationen ändern lediglich die Reihenfolge, du kannst aber keine Zeichen weglassen.

    Wie wärs mit sowas?

    int hits = 0;
    hits += (myString.find('a') != string::npos);
    hits += (myString.find('A') != string::npos);
    hits += (myString.find('0') != string::npos);
    assert(hits == myString.size());
    

    Edit: Ach, du willst ne C-Lösung. Naja, die Vorgehensweise sollte trotzdem klar sein, oder?



  • Vielleicht magste sowas?

    int verbosityLevel=0;
    bool doNothing=false;
    bool showHelp=false;
    for(string::iterator i=str.begin()i!=str.end()++i)
    {
       switch(*i){
          case 'a': 
             verbosityLevel=max(verbosityLevel,1);
             break;
          case 'A': 
             verbosityLevel=max(verbosityLevel,2);
             break;
          case '0': 
             doNothing=true;
             break;
          default:
             cout<<"unrecognized option "<<*i<<'\n';
             //kein break;
          case '?':
             showHelp=true;
       }
    }
    if(showHelp)
       showHelp();
    else
       doMain(verbosityLevel,doNothing)
    

    oder

    int verbosityLevel=0;
    bool doNothing=false;
    bool showHelp=false;
    for(char* i=str;*i!='\0';++i)
    {
       switch(*i){
          case 'a': 
             if(verbosityLevel!=0)
                cout<<"option "<<*i<<" not allowed after other option\n";
             else
                verbosityLevel=1;
             break;
          case 'A': 
             if(verbosityLevel!=0)
                cout<<"option "<<*i<<" not allowed after other option\n";
             else
                verbosityLevel=2;
             break;
          case '0': 
             doNothing=true;
             break;
          default:
             cout<<"unrecognized option "<<*i<<'\n';
          case '?':
             showHelp=true;
       }
    }
    

    Oder Du nimmst find, strchr oder sowas und

    if(strchr(str,'A')!=0) cout<<"Ein A war drin.";
    


  • Das sieht doch schonmal sehr brauchbar aus. Und @Michael E. ja derzeit schreibe ich c da ich das sehr schön in Linux mit Editor und gcc verwenden kann.



  • mirrowwinger schrieb:

    Das sieht doch schonmal sehr brauchbar aus. Und @Michael E. ja derzeit schreibe ich c da ich das sehr schön in Linux mit Editor und gcc verwenden kann.

    Ich will dir nicht ausreden C zu programmieren, aber das kannst du doch genauso gut mit C++ 😕



  • Der Editor bliebe gleich, nur müßte man statt gcc jetzt g++ tippen. Das mache ich auch gelegentlich, weil ich auf ein paar Linux-Rechnern keine grafische Oberfläche habe.



  • mirrowwinger schrieb:

    [...] (Linux über Terminal) [...]

    dafür gibts doch getopt(...) aus der unistd.h



  • Also grob gesehen ist es mir ja egal, ob c oder c++. Eigentlich sehe ich das auch nur als kleinen Test für mich an, mal wieder was in c zu machen.



  • strchr ist doch perfekt, funktioniert auch wenn der Nutzer jetzt AAAAaaaaa???? eingibt. Oder soll das explizit vermieden werden?



  • Also ich möchte meinem Programm mehrere Optionen mit solchen Strings übergeben (so wie bei Linuxprogrammen (Console/ Terminal) üblich). Prinzipiell kann also der Aufruf im Terminal so aussehen:

    ./foo xxx xxx xxx xxx
    

    die Anzahl der Optionen ist variabel und der Inhalt ebenso (siehe 1. Beitrag). Ich möchte jetzt erkennen, was eingegeben wurde, um meinem Programm zu sagen, was getan werden soll. Prinzipell ist dabei natürlich Position und Inhalt der angegebenen Option wichtig.



  • getopt !!


Anmelden zum Antworten