CString Operationen?



  • Hi Leute,

    hab mal wieder das nächste Prob:

    ich will eigentlich von einem CString die ersten Buchstaben und die Wörter großschreiben.
    "hallo das" ->
    "Hallo Das"

    abeer es geht nicht!

    wie kann ich einen Buchstaben rausnehmen, wenn es ein Zeichen aus dem Alphabet ist, großschreiben und wieder zurück in den Cstring tuhen???

    ich hab alles mögliche ausprobiert, aber das einzige was er gemacht hat ist meinen string ziemlich zu verwürfeln! 😞

    Danke, feiadragon

    PS: Das mit dem Vector geht jetzt ! Danke!



  • CString was ist das 😕 😉
    Gehört nicht zum Standard, vielleicht versuchst du es mal im MFC-Forum. 😃

    mfg JJ



  • du durchsuchst den string nach spaces. jedes darauffolgende zeichen, das ein kleinbuchstabe ist, wird dann &-verknüpft mit 0xdf



  • dann wird der buchstaben groß.



  • feiadragon schrieb:

    dann wird der buchstaben groß.

    so ist es

    printf ("%c\n", 'a' & 0xdf);
    

    gibt ein grosses 'A' aus



  • kurze frage wie kommt man auf sowas??? steht das hier irgendwo im Forum oder wie???
    Oder holt man sowas aus der Msdn oder findet man sowas selber?

    😮 Darauf wär ich im Traum nicht drauf gekommen 😃



  • feiadragon schrieb:

    kurze frage wie kommt man auf sowas???

    man muss nur mal eine ascii-tabelle gesehen haben. dann fällt das schon auf

    feiadragon schrieb:

    Darauf wär ich im Traum nicht drauf gekommen

    klar, da kommt jeder drauf. du hast es nur nicht versucht 😉



  • is doch bloß mathe ^^

    stell dir vor, du bekommst werte zwischen 0 und 99, brauchst aber Werte zwischen 100 un 199. was machst du?? richtig! 100 addieren 😉

    Is mit den ASCII werten dass selbe, nur das die zahlen selbst sich ein bischen unterscheiden 😉



  • feiadragon schrieb:

    kurze frage wie kommt man auf sowas???

    Man schaut sich ne ASCII-Tabelle an und sieht, dass man 32 addieren muss. Moment, addieren ist aber nicht geek genug, toupper auch nicht. Also machen wir eine AND-Verknüpfung, damit kein ungeübtes Auge auf Anhieb sehen kann was wir eigentlich machen.



  • MaSTaH schrieb:

    Moment, addieren ist aber nicht geek genug, toupper auch nicht. Also machen wir eine AND-Verknüpfung, damit kein ungeübtes Auge auf Anhieb sehen kann was wir eigentlich machen.

    nix geek.
    wenn man hat:
    "MaSTaHdenktnichtnachbevorerpostet"
    dann wird mit '& 0xdf' daraus:
    "MASTAHDENKTNICHTNACHBEVORERPOSTET"
    mit einer addition würden das 1. 3. 4. und 6. zeichen nicht mehr so toll aussehen.



  • Man würde den case vorher prüfen und könnte es trotzdem besser lesen.

    Ändert ausserdem nichts an der Tatsache dass es scheiße aussieht, also kein Argument gegen toupper.



  • aha... danke!

    aber:

    mein schöner DateiName:

    "abc def ghi.mp3"

    wird elegant zu

    "Abc" gemacht, ohne .mp3 oder andere Sachen...



  • ja, dein ' ' (leerzeichen) wird ja auch ver-and-et.
    versuch mal

    char up (char c) { //helferlein
      return toupper(c);
    }
    
    int main () {	
      //mit char arrays
      char n[] = "abc def.mp3";
      use_facet<ctype<char> >(locale()).toupper(n, n+sizeof(n));
      cout << n << endl;
      //mit std::strings
      string m = "abc def.mp3";
      transform (m.begin(), m.end(), m.begin(), up);
      cout << m << endl;
    }
    

    CString bietet vielleicht ähnliches. da musst du aber die leute im MFC-forum fragen.



  • Ich würde etwas in der Art vorschlagen, ist aber ungetestet und nur schnell hingehackt...

    void convert(char* str) {
      while(*str) {
        if(*str++ == ' ')
          *str = static_cast<char>(toupper(*str));
      }
    }
    

    Falls toupper(0) nicht 0 zurückgibt muss man noch nen check vorher einbauen



  • MaSTaH schrieb:

    Ich würde etwas in der Art vorschlagen, ist aber ungetestet und nur schnell hingehackt...

    void convert(char* str) {
      while(*str) {
        if(*str++ == ' ')
          *str = static_cast<char>(toupper(*str));
      }
    }
    

    Falls toupper(0) nicht 0 zurückgibt muss man noch nen check vorher einbauen

    Diese Funktion funktioniert allerdings nicht für das 1. Zeichen.
    So sollte es gehen:

    void convert(char* str) {
       if(*str) 
          *str = static_cast<char>(toupper(*str));
       while(*str) 
          if(*str++ == ' ')
            *str = static_cast<char>(toupper(*str));
    }
    


  • Hi!

    Es sollte doch wohl "!= ' '" statt "== ' '" heißen oder?

    void convert(char* str) {
       while(*str) {
          if(*str == ' ') // EDIT: aus != -> ==
            *str = static_cast<char>(toupper(*str));
          ++str;
       }
    }
    

    Code-Hacker



  • Code-Hacker: Wieso? Deine Version würde alle Zeichen ausser dem Leerzeichen in den Uppercase wandeln. Das war aber nicht gefragt (und geht btw. einfacher).



  • ---



  • Hi!

    MaSTaH schrieb:

    Code-Hacker: Wieso? Deine Version würde alle Zeichen ausser dem Leerzeichen in den Uppercase wandeln. Das war aber nicht gefragt (und geht btw. einfacher).

    Ah, sry, sehe schon.
    Ansonsten ist das die selbe Version wie deine, nur das das erste Zeichen mitgemacht wird.

    Code-Hacker



  • Nö, schau mal genau hin... Deine Version ändert den String nicht :p 😉 .



  • MaSTaH schrieb:

    Nö, schau mal genau hin... Deine Version ändert den String nicht :p 😉 .

    Meinst du MEINE Version?


Anmelden zum Antworten