检查std :: string是否包含任何小写字符?

q09*_*987 0 c++ boost

#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;
}
Run Code Online (Sandbox Code Playgroud)

问题 >我正在寻找一种有效的方法来检查是否std::string包含全部大写.如果有来自C++标准或boost库的标准函数,那将是最好的.

我自己实现了它的两个版本.但我不确定它们是否足够好.欢迎提出任何建议和意见.

Jer*_*fin 5

我最初的反应可能是这样的:

return std::find_if(str.begin(), str.end(), ::islower) == str.end();
Run Code Online (Sandbox Code Playgroud)

如果您有C++ 11可用,您还可以使用:

return !std::any_of(str.begin(), str.end(), ::islower);
Run Code Online (Sandbox Code Playgroud)

编辑:正如詹姆斯坎泽指出的那样,如果输入错误,这两者中的任何一个都将/将具有未定义的行为(其中"错误"表示几乎所有基本执行字符集中所需的基本ASCII字符之外的行为).要更正它,需要在传递给:: isupper之前将值转换为unsigned char.

struct IsUpper {
    bool operator()(int value) {
        return ::isupper((unsigned char)value); 
    }
};

return std::find_if(str.begin(), str.end(), IsUpper()) == str.end();
Run Code Online (Sandbox Code Playgroud)

要么:

return !std::any_of(str.begin(), str.end(), IsUpper());
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用lambda:

return std::find_if(str.begin(), str.end(), 
    [](int ch) { return ::isupper(unsigned char)ch);}) == str.end();
Run Code Online (Sandbox Code Playgroud)

要么:

return !std:any_of(str.begin(), str.end(), 
    [](char ch) { return ::isupper(unsigned char)ch)); });
Run Code Online (Sandbox Code Playgroud)