2012-02-21 3 views
0
#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++ 표준 또는 부스트 라이브러리의 표준 함수가있는 것이 가장 좋습니다.std :: string에 소문자가 포함되어 있는지 확인하십시오.

나는 두 가지 버전을 직접 구현했습니다. 그러나 나는 그들이 충분히 좋은지 확신하지 못한다. 모든 제안 및 의견은 환영합니다.

+0

http://codereview.stackexchange.com –

+0

하십시오 또는

return !std::any_of(str.begin(), str.end(), IsUpper()); 

, 당신은 람다를 사용할 수 있습니다 "충분히 좋은"의미를 정의하십시오. 어떤 기준에 따라 여기에서 얻은 답 중에서 "가장 좋은"대답을 선택 하시겠습니까? 소문자 (제목 요청)를 감지하는 것은 문자가 모두 대문자인지 (본문 요청과 같은지) 검색하는 것과 동일하지 않습니다. 구두점, 극동 문자, 기호 및 숫자는 대개 어느 것도 아닙니다. –

+0

기본적으로 문자열에 소문자가 포함되어 있는지 여부를 알려주는 미리 정의 된 함수를 찾고 있습니다. 귀하의 포인트가 유효하고 OP에서 내 함수 이름을 변경했습니다. – q0987

답변

5

내 첫 반응은 아마 이런 식으로 뭔가 될 것이다 :

return std::find_if(str.begin(), str.end(), ::islower) == str.end(); 

당신이 경우 C++ 11 사용할 수, 당신은 또한 사용할 수 있습니다

return !std::any_of(str.begin(), str.end(), ::islower); 

편집 : 제임스 칸 세이 류가 지적했듯이, 중/이 두 가지 모두 잘못된 입력 ("잘못된"은 기본 실행 문자 집합에 필요한 기본 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(); 

나 :

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

나는 또한'std :: find_if'를 사용하는 경향이 있습니다. 하지만 나는'std :: string :: npos'가 아닌 end iterator를 체크했다. –

+0

@JamesKanze : 좋은 지적입니다. 고침 - 고마워. –

+1

그리고 이제는 그것에 대해 생각해 보았습니다. 이전에 게시 한 기능적 개체를 사용하고 싶습니다. ':: islower'는 인자로 char를 호출했을 때 정의되지 않은 행동을합니다 (적어도 평범한 char가 서명 된 경우라면). –

관련 문제