Как определить, есть ли буквы в строке? C++

566
17 февраля 2017, 03:07

Как определить, есть ли буквы в строке без функций и очень коротко. (буквы любые - и латинские, и русские)

Answer 1

Если хочется без функций, то можно очень просто

std::string s = "stroka"; // наша строка
for (int i = 0; i< s.length(); i++) { // идем по символам
  if (s[i] >= 'A' && s[i] <= 'Z' || s[i] >= 'a' && s[i] <= 'z') 
     std::cout << "found!" << std::endl;
     break;
  }
}

в коде явно прописан break, так как в задании написно "есть ли буквы". Если хотя бы одну нашли, дальше нет смысла продолжать.

С кириллицей немного сложнее - тут все зависит от кодировок. Так как обычно такие задачи задают для винды, приложение запускают с консоли (которая имеет кодировку 866), а сам код набирают либо в cp1251б либо в utf-8/utf-16, то тут проблема. Поэтому простое решение вида

if (s[i] >= 'A' && s[i] <= 'Z' || s[i] >= 'a' && s[i] <= 'z' ||
s[i] >= 'А' && s[i] <= 'Я' || s[i] >= 'а' && s[i] <= 'я' || 
s[i] == 'Ё' || s[i] == 'ё')

вряд ли сработает так просто. Но возможно, после прочтения поста все и заработает. Да, и буква Ё хитрая, она в cp1251 находиться отдельно. Поєтому и обрабатывается отдельно.

Можно ли данный код написать короче и при этом без функций? можно, но он станет запутанней и вряд ли понравиться преподавателю (задание очень на это похоже).

Кстати, length() - это вообще то функция, но думаю, на нее условие не распространяется.

Answer 2

Для начала, если вы работаете с кириллицей на C++, вам необходимо перейти на широкие строки (wstring), у узких строк масса проблем.

Далее, чтобы не думать о том, где какие символы расположены, проще всего задать список букв вручную один раз.

Получаем:

std::wstring letters =
        L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        L"абвгдеёжщийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";

Имея список букв, проверка тривиальна:

s.find_first_of(letters) != std::wstring::npos

Это один вызов функции. Меньше вызовов функции реально использовать не выйдет, т. к. индексация и опрос размера строк — тоже вызовы функций. Но можно притвориться, что вызовов функций нет в таком коде:

for (auto c : s)
    for (auto c1 : letters)
        if (c == c1)
            return true;
return false;

(хотя в реальности тут под капотом вызываются функции получения итераторов и их инкремента).

Answer 3

Будет искать только латинские

std::string str = "0 - это цифра, O - это буква"; 
bool est = false; 
for ( int i = 0; i < str.size(); i++ ) {
  if ( ( ( str[i] >= 'A' ) && ( str[i] <= 'Z' ) ) 
        || ( ( str[i] >= 'a' ) && ( str[i] <= 'z' ) ) 
     ) { 
    est = true; 
    break;
}

est или не est вот в чем ответ. Сработает на букву 'O'.

Чтобы работало со строками UTF-8 и т.п. (то есть чтобы поддерживало русский и другие языки) так просто уже не получится, придется использовать функции библиотек.

READ ALSO
Проблема с деструктором в С++

Проблема с деструктором в С++

Задача - создать класс stringЯ прописал конструкторы, перегрузил операции, и программа вроде работает нормально, но в последней строке возникает...

410
Можно ли использовать один сокет в нескольких потоках?

Можно ли использовать один сокет в нескольких потоках?

Клиентское приложение на C++ передаёт на HTTP-сервер данные - идентификатор клиента (чтобы обозначить присутствие), кадры с веб-камеры (по запросу),...

408
GNU C++ 4.8.4,перевод из int в char mass[]

GNU C++ 4.8.4,перевод из int в char mass[]

Имеется массив mass[] и число int qНеобходимо записать q по разрядам в массив

330
Зачем boost::asio::io_service помещать в отдельный поток?

Зачем boost::asio::io_service помещать в отдельный поток?

Задался вопросом, а зачем в данном примере io_service в разных потоках

333