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

C++ 在新字符串中将字符串转换为小写,c++,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(

转换字符串可以用

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);
当然,您可以创建一个逐字符的函数,但我认为这不是最优的,我也不会从中学习任何东西…

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

string s1="text";
string s2 = s1;
for ( auto& ch : s2 )
   ch = toupper((unsigned char)ch);
除非需要使用std::transform,否则您可以使用:

string s1="text";
string s2 = s1;
for ( auto& ch : s2 )
   ch = toupper((unsigned char)ch);
transform不知道容器,不会为您插入新元素。提供一个迭代器,用于将指定的值推回:

// DO NOT use this
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ::toupper);
//                                   ^^^^^^^^^^^^^^^^^^^^^^
但是,您不应该使用toupper的全局版本,因为它已被弃用。而且你首先,或未定义的行为很容易遇到

转换似乎不适合这里,因为您需要一个lambda;使用

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

std::transform不知道容器,也不会为您插入新元素。提供一个迭代器,用于将指定的值推回:

// DO NOT use this
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ::toupper);
//                                   ^^^^^^^^^^^^^^^^^^^^^^
但是,您不应该使用toupper的全局版本,因为它已被弃用。而且你首先,或未定义的行为很容易遇到

转换似乎不适合这里,因为您需要一个lambda;使用

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

.

您需要std::back\u inserter。您应该使用std::toupper,并确保在char被签名时不会向其传递负值,以免出现未定义的行为。@chris该示例实际上是从站点复制粘贴的,那么std::string可以有无符号字符或负值吗?@Columbo为什么删除您的答案?@clickstefan,因为我不喜欢它。我发布了帮助的答案,但并不认为它有帮助。你需要STD::Buff-IxEnter。你应该使用STD::ToupPER,并确保如果Char签名,否定值不会传入它,以免你有未定义的行为。@克里斯这个例子是从站点粘贴的,那么std::string可以有无符号字符或负值吗?@Columbo为什么删除您的答案?@clickstefan,因为我不喜欢它。我发布了帮助的答案,但没有考虑它有帮助。哦,我完全忽略了你的循环不同于我的:无论如何,代码仍然缺少演员。我不明白需要铸造。std::toupper将int作为输入。std::transform不是必须的,但这仍然会在实际转换之前创建s1的副本。哦,我完全忽略了您的循环与我的不同:无论如何,代码仍然缺少强制转换。我不理解强制转换的必要性。std::toupper将int作为输入。std::transform不是必须的,但这仍然会在实际转换之前创建s1的副本。对于无符号字符问题,是否需要使用lambda?这使得transformstr->begin,str->end,str->begin,::tolower;也无效?@clickstefan首先需要一个lambda来调用std::tolower。是的,带有transform的行是无效的。问题是,简单地用char调用非本地版本的tolower通常是错误的。因此,对于无符号char问题,需要使用lambda吗?这使得transformstr->begin,str->end,str->begin,::tolower;也无效?@clickstefan首先需要一个lambda来调用std::tolower。是的,带有transform的行是无效的。问题是简单地用char调用非本地版本的tolower通常是错误的。