2016-11-08 3 views
4

Я хотел бы узнать, возможно ли проверить, является ли одна буква строки заглавной. Другой способ увидеть это, если все буквы в строке имеют прописные или строчные буквы. Пример:Проверьте, имеет ли строка букву в верхнем регистре или в нижнем регистре

string a = "aaaaAaa"; 
string b = "AAAAAa"; 

if(??){ //Cheking if all the string is lowercase 
    cout << "The string a contain a uppercase letter" << endl; 
} 
if(??){ //Checking if all the string is uppercase 
     cout << "The string b contain a lowercase letter" << endl; 
} 

Спасибо.

+0

Проверьте 'isupper' и' islower'. Они вам помогут. – NathanOliver

+0

В вашем примере ввода оба 'a' и' b' содержат прописную букву и оба содержат строчные буквы. Что их следует отличать? Мой вопрос в том, когда применяется проверка верхнего регистра, и когда применяется строчная проверка? – alvits

ответ

8

вы можете использовать стандартный алгоритм std::all_of

if(std::all_of(str.begin(), str.end(), islower) { // all lowercase 
} 
+1

'std :: islower' хм? –

+0

Если вы инвертируете условие: '! Std :: any_of (str.begin(), str.end(), isupper)', у вас будет раннее возвращение. – Mikhail

+1

@GillBates std :: islower неоднозначно с версией от '', требующей от пользователя статического приведения к простой версии. – krzaq

5

Это можно легко сделать с помощью лямбда-выражений:

if (std::count_if(a.begin(), b.end(), [](char ch) { return std::islower(ch); }) == 1) { 
    // The string has exactly one lowercase character 
    ... 
} 

Это предполагает, что вы хотите, чтобы обнаружить ровно один верхний регистр/нижний регистр письмо, в соответствии с вашими примерами.

+0

1. 'count_if' является избыточным,' any_of' подходит лучше. 2. Лямбда сама по себе избыточна, просто «std :: islower» будет в порядке. – Mikhail

+0

@Mikhail Это [компилируется и работает с лямбдой] (http://ideone.com/qU2sLB) и [не может скомпилироваться без него] (http://ideone.com/SmtZGG). – dasblinkenlight

+0

Да, я вижу, как упоминалось здесь: http://stackoverflow.com/questions/40496334/check-if-string-has-letter-in-uppercase-or-lowercase#comment68237169_40496404 – Mikhail

5

Используйте all_of совместно с isupper и islower:

if(all_of(a.begin(), a.end(), &::isupper)){ //Cheking if all the string is lowercase 
    cout << "The string a contain a uppercase letter" << endl; 
} 
if(all_of(a.begin(), a.end(), &::islower)){ //Checking if all the string is uppercase 
    cout << "The string b contain a lowercase letter" << endl; 
} 

demo

В качестве альтернативы, используйте count_if, если вы хотите, чтобы проверить номер букв, соответствующих вашему предикату.

+1

Трюк '& :: isupper' хорош! [Я попробовал компиляцию без него] (http://ideone.com/SmtZGG) и получил довольно загадочную ошибку. Теперь я понимаю, что это из-за перегрузки. – dasblinkenlight

Смежные вопросы