专栏首页10km的专栏C++11:基于STL对string,wstring进行大小写转换

C++11:基于STL对string,wstring进行大小写转换

版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/80206022

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_tchar。如果对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 测试

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • c++11:基于STL实现字符串分割更简单 wstring,string split

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • c++11模板:容器(map,set,list,vector)中元素类型转换

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • C++11:string和wstring之间互转换

    今天打算做string到wstring转换时发现以前早已经写过,已经忘记从哪里找来的了,贴出代码,以防再忘记。C++11后UTF8编码转换还真是方便

    用户1148648
  • C++11新特性使用总结

    最近开始使用C++11编码,编码效率和代码质量提升不少,把目前我遇到的提升效率和代码质量的新特性都总结一下。

    阁主的小跟班
  • Cpp(七) std::thread 标准库多线程

    但是使用mutex是不安全的,当一个线程在解锁之前异常退出了,那么其它被阻塞的线程就无法继续下去。

    Coxhuang
  • 运行时类型识别

    运行时类型识别(run-time type identification, RTTI)的功能由两个运算符实现:

    Rock_Lee
  • 【编程基础】C++初学者需掌握的10个C++特性(中)

    Strongly-typed enums 强类型枚举 传统的C++枚举类型存在一些缺陷:它们会将枚举常量暴露在外层作用域中(这可能导致名字冲突,如果同一个作用域...

    程序员互动联盟
  • python基础3

     交换: a,b=b,a 相当于定义了一个元组t=(b,a) 然后将t[0]的值给了a,t[1]的值给了b ####字典#### 定义用花括号 ...

    py3study
  • 【基础教程】Python print()函数高级用法

    前面使用 print() 函数时,都只输出了一个变量,但实际上 print() 函数完全可以同时输出多个变量,而且它具有更多丰富的功能。

    matinal
  • 大数据下的统计学:问题优先而非解法优先

    大数据文摘

扫码关注云+社区

领取腾讯云代金券