wchar_t * tolower...
-
Hi, kann mir jemand sagen(kleiens Beispiel) wie ich einen wchar_t *str; in Kleinbuchstaben kriege?
Vielen Dank im Voraus
wcharrrr
-
#include <iostream> #include <algorithm> #include <locale> #include <functional> int main() { std::wstring test( L"Hallo Welt" ); std::transform( test.begin(), test.end(), test.begin(), std::bind1st( std::mem_fun( &std::ctype< wchar_t >::tolower ), &std::use_facet< std::ctype< wchar_t > >( std::locale() ) ) ); std::wcout << test << std::endl; std::cin.get(); }
-
Ist es notwendig über einen wstring zu gehen? Ich kann leider keinen benutzen, muss also über wchar_t dirket gehen, wie stelle ich das an?

Vielen Dank im Voraus,
wcharrrr
-
Mit towlower Zeichen für Zeichen konvertieren. Besseres kenne ich da auch nicht.
-
Klar geht das:
wchar_t test[] = L"Hallo Welt"; std::transform( test, test + 10, test, std::bind1st( std::mem_fun( &std::ctype< wchar_t >::tolower ), &std::use_facet< std::ctype< wchar_t > >( std::locale() ) ) );
-
Gott o Gott...
-
Badestrand schrieb:
Gott o Gott...
Was denn? Geht doch?!

Ok, andere Idee:

template< typename T > struct to_lower_fun : public std::unary_function< T, T > { to_lower_fun( const std::locale& loc_ ) : loc( loc_ ) {} T operator()( T c ) const { return std::tolower( c, loc ); } private: const std::locale& loc; }; template< typename T > inline void to_lower( T* in, const std::locale& loc = std::locale() ) { std::transform( in, in + std::char_traits< T >::length( in ), in, to_lower_fun< T >( loc ) ); } int main() { wchar_t test[] = L"Hallo Welt"; to_lower( &test[ 0 ] ); std::wcout << test << std::endl; std::cin.get(); }
-
Hi,
ich habs jetzt so gemacht:for (unsigned int i = 0; i < wcslen(compare); i++) { if (iswupper(compare[i])) { compare[i] = tolower(compare[i]); } wprintf(L"%c", compare[i]); }Ist das auch okay? Oder gibts da was dran auszusetzen? Ich würds gerne ohne die STL lösen. Ist dann evtl. kein C++ mehr, aber ich habs mir einfacher vorgestellt. Also wie soll ichs jetzt machen?
Vielen Dank,
wcharrrr
-
Was hast du denn gegen die STL?
Da, ohne STL:
const std::locale& loc = std::locale(); for ( unsigned i = 0; i < std::char_traits< wchar_t >::length( compare ); ++i ) { if ( std::isupper( compare[ i ], loc ) ) { compare[ i ] = std::tolower( compare[ i ], loc ); } }
-
Danke,
so funktionierts perfekt
Allerdings nutzt du ja nicht wcslen?
Kannst du das mal erklären? Ich habe überall wcslen benutzt, vielleicht sollte ich das umstellen? Noch ist es möglich
Danke!
wcharrrrr
-
Doch, klar kannst du das verwenden. Die C++ Traits bieten nur die Möglichkeit leichter zwischen char und wchar_t zu wechseln.
-
Hi,
ich habe aber noch ein Problem und zwar, erzeugt dein Code irgendwie ein Speicherproblem hab ich das Gefühl:const std::locale& loc = std::locale(); for (unsigned i = 0; i < wcslen(compare); i++) { if (std::isupper(compare[i], loc)) { compare[i] = std::tolower(compare[i], loc); } }Der Speicher steigt im Taskmanager ziemlich weit nach Oben und auf einmal ist er wieder fast leer. Ohne deinen Code ist der Speicher jedoch konstant. Das macht mir Sorgen! Wie kann ich das verhindern?
Danke
