文档章节

C++中string与string.c_str()打印的结果可能不相同

yoyoso
 yoyoso
发布于 2014/12/18 17:03
字数 476
阅读 83
收藏 0

想要将一个std::string字符串转换成小写,经搜索使用了std::transform来实现,可是偶然发现了打印string与string.c_str()会有不同的结果。

代码如下:

string strTitle("TEST");
string strLowercase;
std::transform(strTitle.begin(), strTitle.end(), strLowercase.begin(), ::tolower);
printf("strLowercase.c_str() is %s", strLowercase.c_str());std::cout<<"string strLowercase is "<<strLowercase<<endl;


结果竟然是:

strLowercase.c_str() is test
string strLowercase is

单步调试也发现strLowercase的打印结果为空,而strLowercase.c_str()打印的是预期结果。


把第三行代码改成下面的就没问题了:

std::transform(strTitle.begin(), strTitle.end(), std::back_inserter(strLowercase), ::tolower);


对std::transform不熟,对std::back_inserter也不了解,以后有空还是要研究一下才行。

一些资料:

关于std::transform,有两种可能的实现方式:
First version

template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, 
                   UnaryOperation unary_op)
{
    while (first1 != last1) {
        *d_first++ = unary_op(*first1++);
    }
    return d_first;
}

Second version

template<class InputIt1, class InputIt2, 
         class OutputIt, class BinaryOperation>
OutputIt transform(InputIt first1, InputIt last1, InputIt first2, 
                   OutputIt d_first, BinaryOperation binary_op)
{
    while (first1 != last1) {
        *d_first++ = binary_op(*first1++, *first2++);
    }
    return d_first;
}


std::back_inserter的定义:

template< class Container >
std::back_insert_iterator<Container> back_inserter( Container& c );
 解释:back_inserter is a convenience function template that constructs a std::back_insert_iterator for the container c with the type deduced from the type of the argument. 

Parameters
c     -     container that supports a push_back operation
Return value
A std::back_insert_iterator which can be used to add elements to the end of the container c 

可以看到back_inserter函数会返回一个std::back_insert_iterator类型的迭代器,用于在容器c后面增加元素。最上面的代码为什么要使用std::back_inserter就很明显了。

另外一个发现:std::back_inserter(strLowercase)是可以用于push_back操作的,而错误的代码中有strLowercase.begin()没报错,说明string也能执行push_back操作是不是?一搜果然是的



参考:

http://en.cppreference.com/w/cpp/algorithm/transform 

http://en.cppreference.com/w/cpp/iterator/back_inserter 

© 著作权归作者所有

共有 人打赏支持
yoyoso
粉丝 49
博文 129
码字总数 45109
作品 0
南京
高级程序员
私信 提问
C++ 中int,char,string,CString类型转换(一)

c++中string到int的转换 1) 在C标准库里面,使用atoi: #include <cstdlib> #include <string> std::string text = "152"; int number = std::atoi( text.cstr() ); if (errno == ERANGE) /......

simpower
2015/08/07
0
0
C++ 多线程编程总结

C++ 多线程编程总结 在开发C++程序时,一般在吞吐量、并发、实时性上有较高的要求。设计C++程序时,总结起来可以从如下几点提高效率: l 并发 l 异步 l 缓存 下面将我平常工作中遇到一些问题...

晨曦之光
2012/06/07
265
0
C++ 多线程编程总结

在开发C++程序时,一般在吞吐量、并发、实时性上有较高的要求。设计C++程序时,总结起来可以从如下几点提高效率: 并发 异步 缓存 下面将我平常工作中遇到一些问题例举一二,其设计思想无非以...

虫虫
2012/05/16
17.5K
11
Cocos2d-x中关于lua的坑

上周在项目开发中遇到一个奇怪的问题,某个c++模块解压完的字节流数据传递给lua后,lua在做基于字节流的反序列化时始终出错,刚开始以为是不是c++模块读取出来的字节流有问题,但是debug发现,c+...

pigsoldier
2014/07/06
0
0
CString,int,string,char*之间的转换

《C++标准函数库》中说的 有三个函数可以将字符串的内容转换为字符数组和C—string 1.data(),返回没有”0“的字符串数组 2,c_str(),返回有”0“的字符串数组 3,copy() .....................

橘子红了呐
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nacos之springboot

本地操作系统:ubuntu18,我使用docker的方式启动nacos服务 docker image方式启动nacos 在docker hub上可以搜到nacos-server List-1.1 拉去最新的版本 mjduan@mjduan-ubuntu:/opt/software$ ...

克虏伯
30分钟前
2
0
指针数组和数组指针的区别

这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。 指针数组:arr...

天王盖地虎626
今天
3
0
Qt那些事0.0.18

今天要记一下Qt中的Resource。自我感觉理解的不错,但是还会难免有谬误,在日后有可能会更新,也有可能不会。 小声的念叨一句,女人心,海底针。 今天就直接跳过了关于QML在qrc文件中的介绍,...

Ev4n
今天
2
0
深入解析js的作用域、预解析机制

虽然,ES6在我们工作中应用得越来越广泛,但是还是很多项目保留着ES5的写法,所以,今天,带着大家重新巩固下ES5下的作用域及预解析机制。 概念: 作用域:域,指的是一个空间、范围、区域,...

前端攻城老湿
今天
2
0
Spring Cloud Feign - 声明式 REST Client

1、Feign是什么 声明式REST client,来自NetFlix。 允许你编写无实现代码调用REST services 替换RestTemplate(甚至更简单) Spring Cloud 为使用Feign提供了包装器 2、怎样使用Feign 对比:...

Benz001
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部