String durchsuchen Gross/Klein egal



  • Knuddlbaer schrieb:

    Sieht man davon ab das es sich bis auf cout und cin eigentlich um C handelt:

    iostream.h durch iostream ersetzen
    conio.h ist nicht portabel
    strings sind leichter in der Anwendung als char Arrays
    Die Suchroutine erfüllt übrigens 'a' == 'A' nicht.

    Magst ja recht haben, bis auf die Tatsache das die Groß- und Kleinschreibung in diesem Falle egal sein sollte. Gut, bis auf cin und cout ist es c, aber dabei handelt es sich um eine Erweiterung.
    Warum sollte die conio.h nicht portabel sein?



  • Ich geb auchmal meinen Senf dazu.

    //werden vorher definiert
    //char Quelle[]...
    //char Maske[]... "a"
    
    void foo(char Quelle, char Maske)
    {
    char *q,*m
    q=_strupr(_strdup(Quelle));
    m=_strupr(_strdup(Maske));
    
    if(strstr(q,m))
        cout<<"Treffer"<<endl;
    }
    

    Wenn Du Dir da ne schöne Schleife drum machst siehts evtl. netter aus.



  • Warum sollte die conio.h nicht portabel sein?

    Sie *ist* nicht portabel. Sie gehört weder zum C++ Standard noch ist sie übermäßig häufig anzutreffen (unter Windows geht's noch, unter Unix/Linux wirst du kein Glück haben). Wenn ich mich recht entsinne, stammt dieses conio-Gedöns ursprünglich von Borland. Im Konsolenforum werden/wurden imo Alternativen besprochen.



  • daishi schrieb:

    Ich geb auchmal meinen Senf dazu.
    [...]

    Jo. Mehr als Senf ist das auch nicht 😃

    Mal ehrlich. Ist das so eine Art Pseudo-Code mit eingebautem "Such-die-Fehler"-Spiel?



  • Wieso? 😕
    Bei mir funktioniert es, und es ist doch eh nur der Teil wichtig, der die Aktion dann auch ausführt.

    Oder wäre es schöner, wenn man gleich immer ganze Quelltexte reinhängt?



  • daishi schrieb:

    Wieso? 😕
    Bei mir funktioniert es,

    Echt? Hast du einen von diesen Magic-Compilern die den "do what I mean"-Operator implementieren?

    //werden vorher definiert
    //char Quelle[]...
    //char Maske[]... "a"

    void foo(char Quelle, char Maske)

    Wer hat recht? Der Kommentar oder der Code? Entweder Array oder Zeichen.

    char *q,*m

    Da fehlt wohl ein Semikolon?

    _strdup(Quelle)

    Also das strdup das ich kenne arbeitet auf Zeichenketten, nicht auf einzelnen Zeichen. Ein char ist nicht implizit nach char* konvertierbar.
    Nächste Zeile selber Fehler.

    Desweiteren erzeugt strdup eine Kopie dessen Speicher dynamisch angefordert wurde. Der Aufrufer ist für die Freigabe dieses Speichers zuständig. Das fehlt hier -> Memory Leak -> nicht gerade meine Definition von "funktioniert".

    Weder _strdup noch _strupr sind Standard-C++ Funktionen. Wird sind hier nun mal aber im Standard-C++ Forum.

    Oder wäre es schöner, wenn man gleich immer ganze Quelltexte reinhängt?

    Ne. Bitte nicht. Nur entwder man postet Quelltext oder als solchen erkennbaren Pseudo-Code. Pseudo-Quelltext ist wenig hilfreich. Und falscher Pseudo-Quelltext verbessert die Situation auch nicht wirklich.



  • @Knuddlbaer: Du veränderst die Originalstrings. Wie wäre es stattdessen eine kleine vergleichfunktion zu basteln und std::mismatch oder std::equal zu verwenden?

    bool insnsitiv_char_compare (char lhs, char rhs)
    {
       return std::tolower(lhs) == std::tolower(rhs);
    }
    
    ...
    
    bool result = std::equal(foo.begin(), foo.end(), bar.begin(), insnsitiv_char_compare);
    


  • Es geht ja nur um die Suche von einem Zeichen, da würde ich doch so etwas nehmen

    #include <string>
    #include <algorithm>
    #include <cctype>
    
    namespace {
      class find_char {
        char c_m;
      public:
        find_char(char c) : c_m(std::tolower(c)) { }
        bool operator()(const char &i) {
          return std::tolower(i)==c_m;
        }
      };
    }
    
    bool find(const std::string &s,char c) {
      find_char find_it(c);
      return std::find_if(s.begin(),s.end(),find_it)!=s.end();
    }
    
    int main() {
      std::string foo="hallo welt und der rest";
      if(find(foo,'R'))
        return 1;
      return 0;
    }
    


  • @helium

    ich hab das in nen 2. String gehängt und die dann transformiert weil ich mit find etwas mittendrinn finden will.

    equal setzt ja voraus das die strings gleich sind. Was ich aber wieder überlesen habe das er nur 1 Zeichen sucht. (Wobei man das wieder in frage stellen kann weil strstr erwähnt wurde)

    Aber thx, an eqaul vergesse ich immer wieder mal O🤡



  • @HumeSikkins
    Ok,ok
    da habe ich mir also jedemende Fehler in den kurzen Code reingehauen.



  • Öhh...

    geht stristr() nicht?

    greetz
    SLi



  • stristr kenne ich nur aus PHP. Bin aber zu faul um nachzuschauen obs das auch im C++ Standard gibt.



  • Nee, der Standard kennt kein stristr.

    btw:
    Muss man denn unbedingt einen ein Jahr alten Thread wieder aus dem Reich der Toten holen?


Anmelden zum Antworten