Хм, три ответа здесь удалось использовать tolower
неправильно .
Его аргумент должен быть неотрицательным или специальным значением EOF
, в противном случае неопределенное поведение.Если все, что у вас есть, это символы ASCII, то все коды будут неотрицательными, поэтому в этом особом случае его можно использовать напрямую.Но если есть какой-либо не-ASCII символ, как в норвежском "blåbærsyltetøy" (черничное варенье), то эти коды, скорее всего, отрицательны, поэтому необходимо привести аргумент к типу без знака char
.в этом случае языковой стандарт C должен быть установлен на соответствующий языковой стандарт.
Например, вы можете установить его в языковой стандарт пользователя по умолчанию, который обозначается пустой строкой в качестве аргумента setlocale
.
Пример:
#include <iostream>
#include <string> // std::string
#include <ctype.h> // ::tolower
#include <locale.h> // ::setlocale
#include <stddef.h> // ::ptrdiff_t
typedef unsigned char UChar;
typedef ptrdiff_t Size;
typedef Size Index;
char toLowerCase( char c )
{
return char( ::tolower( UChar( c ) ) ); // Cast to unsigned important.
}
std::string toLowerCase( std::string const& s )
{
using namespace std;
Size const n = s.length();
std::string result( n, '\0' );
for( Index i = 0; i < n; ++i )
{
result[i] = toLowerCase( s[i] );
}
return result;
}
int main()
{
using namespace std;
setlocale( LC_ALL, "" ); // Setting locale important.
cout << toLowerCase( "SARAH CONNER LIKES BLÅBÆRSYLTETØY" ) << endl;
}
Пример того, как вместо этого сделать это, используя std::transform
:
#include <iostream>
#include <algorithm> // std::transform
#include <functional> // std::ptr_fun
#include <string> // std::string
#include <ctype.h> // ::tolower
#include <locale.h> // ::setlocale
#include <stddef.h> // ::ptrdiff_t
typedef unsigned char UChar;
char toLowerCase( char c )
{
return char( ::tolower( UChar( c ) ) ); // Cast to unsigned important.
}
std::string toLowerCase( std::string const& s )
{
using namespace std;
string result( s.length(), '\0' );
transform( s.begin(), s.end(), result.begin(), ptr_fun<char>( toLowerCase ) );
return result;
}
int main()
{
using namespace std;
setlocale( LC_ALL, "" ); // Setting locale important.
cout << toLowerCase( "SARAH CONNER LIKES BLÅBÆRSYLTETØY" ) << endl;
}
Пример использования языка локали уровня C ++ вместо языка C см. В Johannes 'ответ.
Приветствия и hth.,