簡體   English   中英

檢查std :: string是否包含任何小寫字符?

[英]Check std::string whether contains any lowercase character?

#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;
}

問題 >我正在尋找一種有效的方法來檢查std::string是否包含所有大寫字母。 如果有C ++標准或boost庫中的標准函數,那將是最好的。

我已經實現了它的兩個版本。 但是我不確定它們是否足夠好。 歡迎任何建議和評論。

我最初的反應可能是這樣的:

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)); });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM