【问题标题】:How do i convert all alphabets to uppercase using transform ignoring digits?如何使用忽略数字的转换将所有字母转换为大写?
【发布时间】:2020-12-10 07:23:11
【问题描述】:

我只需要将字符串中的字母转换为大写,并尝试了这段引发错误的代码。

   s = "Dense-123-Sparse-999" 
   std::transform(s.begin(), s.end(), s.begin(), std::toupper);

预期输出:“DENSE-123-SPARSE-999”

“错误:非void lambda没有在所有控制路径中返回值[-Werror,-Wreturn-type]”

由于输入字符串中有数字,因此引发错误。如何编写一个仅当字符是字母而不是数字时才将字符转换为大写的 lambda 函数?

类似的,

transform_if(s.begin(), s.end(), s.begin, [](char c){ if(isalpha(c)return toupper(c);});

由于 C++ 没有 transform_if,我正在寻找带有任何其他命令的 one liner

【问题讨论】:

标签: c++ string lambda transform toupper


【解决方案1】:

使用 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

【讨论】:

  • 不适用于Être ou ne pas être 或您自己的印地语姓名,或我自己的俄语姓名 (СТАРЫНКЕВИЧ)
  • @BasileStarynkevitch 已经讨论过 [这里](stackoverflow.com/questions/36897781/…
【解决方案2】:

回答我自己的问题,用lambda 代码找出transformfor_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 的 cmets 在UTF-8 上教育我们,我的代码因以下情况而失败:

input: "èéêrię"

output: "èéêRIę" (wrong)

需要返回并搜索 UTF-8 库的使用情况

【讨论】:

  • 参见Lambda expressions[](unsigned char c) { return std::toupper(c); }
  • 因为你有两个分号,我认为这不能算作“一个衬里”
猜你喜欢
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 2011-06-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多