#include <boost/spirit/home/support/char_encoding/ascii.hpp>
bool IsStringAllNonLowercaseA(const std::string& str)
{
std::string newStr(str);
boost::to_upper(newStr);
if (newStr == str)
return true;
else
return false;
}
bool IsStringAllNonLowercaseB(const std::string& str)
{
for (std::string::const_iterator iter=str.begin(); iter != str.end(); ++iter)
{
if (boost::spirit::char_encoding::ascii::islower(*iter))
return false;
}
return true;
}
问题&GT;我正在寻找一种有效的方法来检查std::string
是否包含全部大写。如果有来自C ++标准或boost库的标准函数,那将是最好的。
我自己实现了两个版本。但我不确定它们是否足够好。欢迎任何建议和意见。
答案 0 :(得分:5)
我最初的反应可能是这样的:
return std::find_if(str.begin(), str.end(), ::islower) == str.end();
如果你有C ++ 11,你也可以使用:
return !std::any_of(str.begin(), str.end(), ::islower);
编辑:正如James Kanze指出的那样,如果输入错误,这两者中的任何一个/都将具有未定义的行为(其中“错误”表示基本执行字符集中所需的基本ASCII字符之外的几乎所有内容)。要更正它,需要将值转换为unsigned char,然后再传递给:: isupper。
struct IsUpper {
bool operator()(int value) {
return ::isupper((unsigned char)value);
}
};
return std::find_if(str.begin(), str.end(), IsUpper()) == str.end();
或:
return !std::any_of(str.begin(), str.end(), IsUpper());
或者,您可以使用lambda:
return std::find_if(str.begin(), str.end(),
[](int ch) { return ::isupper(unsigned char)ch);}) == str.end();
或:
return !std:any_of(str.begin(), str.end(),
[](char ch) { return ::isupper(unsigned char)ch)); });