转换字符串可以使用
完成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,但我认为这不是最优的,而且我没有从中学到任何东西...
答案 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);
答案 1 :(得分:1)
除非要求使用std::transform
,否则您可以使用:
string s1="text";
string s2 = s1;
for ( auto& ch : s2 )
ch = toupper((unsigned char)ch);