C++標準庫有對字元進行大小寫轉換的函數,但並沒有提供對字串的大小寫轉換函式,對C++ std::string進行字串轉換網上有很多文章了,
對於std::string,使用STL庫algorithm中的transform類比函數就可以實現,比如這篇文章:
《C++對string進行大小寫轉換》
#include <iostream> #include <string>#include <algorithm>#include <iterator>#include <cctype>using namespace std;int main() { string src = "Hello World!"; string dst; transform(src.begin(), src.end(), back_inserter(dst), ::toupper); cout << dst << endl; transform(src.begin(), src.end(), dst.begin(), ::tolower); cout << dst << endl; return 0; }
上面的代碼調用transform函數遍曆std::string的每個字元,對每個字元執行::toupper或::tolower就實現了大小寫轉換。
然而對於寬字元集的字串(std::wstring),上面的辦法就適用了,因為::toupper或::tolower函數並不能區分wchar_t和char。如果對std::wstring調用::toupper或::tolower進行轉換,就會把字串中的寬字元集內容(比如中文)破壞。
這時需要用到<locale>庫中的toupper,tolower模板函數來實現大小寫轉換。
實現代碼如下,下面的模板函數(toupper,tolower)支援std::string,std::wstring類型字串大小寫轉換
#pragma once#include <algorithm>#include <locale>#include <string>namespace l0km{ template<typename E, typename TR = std::char_traits<E>, typename AL = std::allocator<E>> inline std::basic_string<E, TR, AL> toupper(const std::basic_string<E, TR, AL>&src) { auto dst = src; static const std::locale loc(""); transform(src.begin(), src.end(), dst.begin(), [&](E c)->E {return std::toupper(c, loc); }); return dst; } template<typename E, typename TR = std::char_traits<E>, typename AL = std::allocator<E>> inline std::basic_string<E, TR, AL> tolower(const std::basic_string<E, TR, AL>&src) { auto dst = src; // 使用當前的locale設定 static const std::locale loc(""); // lambda運算式負責將字串的每個字元元素轉換為小寫 // std::string的元素類型為char,std::wstring的元素類型為wchar_t transform(src.begin(), src.end(), dst.begin(), [&](E c)->E {return std::tolower(c, loc); }); return dst; }} /* namespace l0km */
調用樣本
using namespace l0km;int main() { std::wcout.imbue(std::locale(std::locale(), "", LC_CTYPE)); std::wcout << gdface::tolower(std::wstring(L"字串轉小寫TEST HELLO WORD 測試")) << std::endl; std::wcout << gdface::toupper(std::wstring(L"字串轉大寫test hello word 測試")) << std::endl;}
輸出:
字串轉小寫test hello word 測試
字串轉大寫TEST HELLO WORD 測試