我只需要将字符串中的字母转换为大写,并尝试了这段引发错误的代码。
s = "Dense-123-Sparse-999"
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
预期输出:"DENSE-123-SPARSE-999";
"错误:非void lambda没有在所有控制路径中返回值[-Weror,-Rewesturn-type]";
由于输入字符串中有数字,因此会引发错误。只有当字符是字母表而不是数字时,我才能编写一个将字符转换为大写的lambda函数?
像这样的
transform_if(s.begin(), s.end(), s.begin, [](char c){ if(isalpha(c)return toupper(c);});
由于C++没有transform_if,我正在寻找一个带有任何其他命令的单行。
使用Lambda或函数
char upperize(char c)
{
return toupper(c);
}
transform(s.begin(),s.end(),s.begin(),upperize);
transform(s.begin(),s.end(),s.begin(),[](char s){return toupper(s);});
cout<<s;
除了,你还可以使用isalpha
在回答我自己的问题时,用lambda
代码计算出了transform
和for_each
。适用于没有重音的字母。
for_each(s.begin(), s.end(), [](char &c) { c = (isalpha(c))? toupper(c):c; } ) ;
或
transform(s.begin(), s.end(), s.begin(), [](char &c) { return (isalpha(c))?toupper(c):c ; });
由于Basile的评论教育了我们UTF-8,我的代码在以下情况下失败了:
input: "èéêrię"
output: "èéêRIę" (wrong)
将需要返回并搜索UTF-8库使用