LowerCase?



  • Original erstellt von HumeSikkins:
    **```cpp
    transform(s.begin(), s.end(), s.begin(), (int(*)(int))tolower);

    zu welchen problem kann es kommen wenn ich den cast weglasse?
    ahja und sonst zu den cast, das man statt eines reinterpret_cast ein c-cast schreib kann ich noch verstehen
    aber wieso hier?

    [QUOTE]Original erstellt von Shade Of Mine:
    [QB]wie wärs mit:

    template<class T>
    void toLower(const T& str)
    {
      typename T::iterator i=str.begin();
      typename T::iterator end=str.end();
      while(i!=end)
      {
        *i=tolower(*i);
        ++i;
      }
    }
    

    hier gibt probleme mir den const
    und den großen vorteil von templates sehe ich hier nicht



  • Und wo ist da der Vorteil gegenüber std::transform?

    Ich vermute, das Lars std::transform gar nicht kannte.

    und nman's Version funzt wenn ich grade keinen Knoten im Kopf hab nicht. Wann soll den der erste Buchstabe bearbeitet werden?



  • zu welchen problem kann es kommen wenn ich den cast weglasse?

    Mehrdeutigkeiten, wenn beim Aufruf mehrere tolower-Überladungen sichtbar sind.
    Damit hatte ich bisher aber nur im Zusammenhang mit einigen gcc-Versionen Probleme.

    ahja und sonst zu den cast, das man statt eines reinterpret_cast ein c-cast schreib kann ich noch verstehen
    aber wieso hier?

    Hier wäre definitiv ein static_cast angebrachter. Der C-Code ist Mist, so wie 90% der Sachen die ich poste 😃

    hier gibt probleme mir den const
    und den großen vorteil von templates sehe ich hier nicht

    und strenggenommen sollte man jedes Zeichen zumindest noch nach unsigned char casten.



  • Original erstellt von Helium:
    **Ich vermute, das Lars std::transform gar nicht kannte.
    **

    Richtig vermutet. Weshalb dieser böse Cast hier? Kannst du mir das mal erklären, sehe std::transform zum ersten mal.

    @iterator-verstecken:
    Iteratoren sind ja dazu da um Algorithmen wiederverwendbarer zu machen. So funktioniert das nur wenn die String-Klasse iterator genau so wie die STL unterstüzt. So lässt sich die Funktion kaum wiederverwenden. Anderfalls könnte man z.B. mit einer völlig fremden Stringklasse sowas o.ä. machen:
    XX::String specialStringClass;
    ToLower(speciealStringClass.getCStr(), speciealStringClass.getCStr()+speciealStringClass.length());

    Warum sollte man die Iteratoren verstecken 😕 😕



  • Warum sollte man die Iteratoren verstecken

    Ganz einfach, weil Iteratoren eine Abstraktion sind, die man nicht immer haben will. Natürlich ist es cleverer eine generelle Funktion (wie z.B. sort) so generisch wie möglich zu machen, in *konkreten* Fällen ist ein schönes Interface aber auch nicht zu verachten. Deshalb gibt es z.B. viele Leute die sich ein ein-Parameter-sort für Arrays basteln. Und das selbe gilt auch für strings.
    Ein:

    string s;
    tolower(s);
    

    ist IMHO deutlich klarer, als ein:

    string s;
    tolower(s.begin(), s.end());
    

    Wobei man ersteres sicher über letzteres implementiert.

    So lässt sich die Funktion kaum wiederverwenden

    Noch vor die Wiederverwendbarkeit sollte man erstmal die Verwendbarkeit stellen. Auch wenn die Marketingabteilung da anderer Meinung ist 🙂

    Weshalb dieser böse Cast hier? Kannst du mir das mal erklären, sehe std::transform zum ersten mal.

    An welcher Stelle reicht dir meine vorherige Erklärung nicht?



  • Hmm..sind ja doch noch recht viele Vorschläge für ein "toLower" gekommen, doch bei der Funktion die ich mir geschrieben habe, zur Erinnerung:

    string MakeLower(string text) // hab noch etwas geringfügig verändert
    {
     for(int i=0;i<=text.length();i++) 
     {
      if(text>64 && text[i]<91)  //Handelt es sich um einen Grossbuchstaben?
      {
       text[i]+=32; //Umwandlung in einen Kleinbuchstaben
      }
     }
     return text;
    }
    

    Gibt es jetzt folgendes Problem, ich rufe MakeLower in meinem Programm folgendermaßen auf:

    ..
    getline(Q,line);
    SearchHTMLTag(line);
    //--------------------------------------------------------------------------
    int SearchHTMLTag(string data)
    {
     int pos;
     data=MakeLower(data);
     pos=data.find("<html>");
     if(pos!=string::npos)
     { return pos; }
     else return -1;
    }
    

    nun wird mein Programm aber abgebrochen, mit folgender Fehlermeldung:
    [i]Unhandled exception in Project1.exe: 0xC0000005: Access Violation*
    Der Debugger zeigt mir dann die datei XSTRING (oder so ähnlich)..was ist an meinem MakeLower falsch? Mit Konstanten gehts wunderbar.Sollte ich lieber eine Funktion verwenden die ihr hier gepostet habt? wenn ja, warum?

    ich hoffe hier schaut nochmal einer vorbei. 🙄

    thx && cya



  • tipp:
    der index des letzen elements in ein array ist (size - 1),



  • also:

    for(int i=0;i<=text.length()-1;i++)
    

    oder was? das hatte ich auch schon probiert doch leider.. oder versteh ich gerade nich was du meintest? hlp!!!! 🙄 😕 😞



  • wieso eigentlich nicht

    #include <iostream>
    #include <locale>
    using namespace std;
    
    int main () {
         char x[] = "HELLO WORLD";
         cout << "Vorher: " << x << '\n';
         use_facet<ctype<char> >(locale("")).tolower (x, x+11);
         cout << "Nachher: " << x << '\n';
    }
    

    was spricht dagegen?



  • nun ja dagegen spricht dass ich das noch nicht kannte und zweitens möchte ich wissen was an meiner methode falsch ist..weiss denn keiner rat?

    ich will meine <String.h> wieder! 😞


Anmelden zum Antworten