C++11:基於STL對string,wstring進行大小寫轉換__C++

來源:互聯網
上載者:User

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 測試

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.