在新字符串中将字符串转换为小写

时间:2014-11-04 22:26:40

标签: c++

转换字符串可以使用

完成
std::transform(s.begin(), s.end(), s.begin(), ::toupper);

但是将其转换为新修改过的副本的最佳方法是什么?

试过:

string s1="text",s2;
std::transform(s1.begin(), s1.end(), s2.begin(), ::toupper);

但它在运行时因"分段错误"

而失败

我设法做到了:

string s1="text",s2;
s2 = s1;
std::transform(s2.begin(), s2.end(), s2.begin(), ::toupper);

当然你可以创建一个函数来char显示char,但我认为这不是最优的,而且我没有从中学到任何东西...

2 个答案:

答案 0 :(得分:5)

std::transform不知道容器,也不会为您插入新元素。
std::back_inserter提供push_back指定值的迭代器:

// DO NOT use this
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ::toupper);
//                                   ^^^^^^^^^^^^^^^^^^^^^^

但是,您不应使用全球版toupper,因为它已被弃用。
您首先要have to cast the argument to unsigned char,或者很容易遇到未定义的行为。

transform似乎不适合这里,因为你需要一个lambda;使用

for (auto ch : s1)
    s2 += std::toupper((unsigned char)ch);

Demo

答案 1 :(得分:1)

除非要求使用std::transform,否则您可以使用:

string s1="text";
string s2 = s1;
for ( auto& ch : s2 )
   ch = toupper((unsigned char)ch);