将string字符串中的字符转为全部大写或者全部小写

使用<algorithm.h>中的transform算法。

#include <iostream>
#include <algorithm>

int main() {
  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);
  std::cout << "hello in upper case: " << out << std::endl;
}
但是直接编译上述的代码,编译器会报错。报错信息为:

no matching function for call to transform(
    __gnu_cxx::__normal_iterator<char*, std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >, 
    __gnu_cxx::__normal_iterator<char*, std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >, 
    std::back_insert_iterator<std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >,
    <unresolved overloaded function type>)’
只要把代码中的 std :: toupper改为::toupper就好了,原因在于我们在这里要使用在全局定义的toupper。而不是在命名空间std下定义的toupper。本人的观点是toupper是一个函数,现在编译器搞不清到底要调用哪个命名空间下的toupper函数了。这也是为什么错误信息会提示“unresolved overloaded function type”的原因。


为了帮助编译器解析正确的重载函数,可以对std::toupper做强制类型转换。

(int (*)(int))std::toupper
也就是如下代码:
std::transform(s.begin(), s.end(), std::back_inserter(out),(int (*)(int))std::toupper)
在这里我的理解是命名空间下定义的toupper是一个模板类型的函数。而全局空间的toupper是一个形参为int,返回值也为int的函数。在这里强制转换std::toupper也可以帮助编译器找到正确的重载函数。
注意:
1. 要把string里面的字符全部转换为小写,只需要使用tolower就行了。
2. string里面即便有中文字符,也不影响字符转换。比如把“中国,Hi” 转换为“中国,HI”或者“中国,hi”。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值