Как определить, есть ли буквы в строке без функций и очень коротко. (буквы любые - и латинские, и русские)
Если хочется без функций, то можно очень просто
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()
- это вообще то функция, но думаю, на нее условие не распространяется.
Для начала, если вы работаете с кириллицей на 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;
(хотя в реальности тут под капотом вызываются функции получения итераторов и их инкремента).
Будет искать только латинские
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 и т.п. (то есть чтобы поддерживало русский и другие языки) так просто уже не получится, придется использовать функции библиотек.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Задача - создать класс stringЯ прописал конструкторы, перегрузил операции, и программа вроде работает нормально, но в последней строке возникает...
Клиентское приложение на C++ передаёт на HTTP-сервер данные - идентификатор клиента (чтобы обозначить присутствие), кадры с веб-камеры (по запросу),...
Имеется массив mass[] и число int qНеобходимо записать q по разрядам в массив
Задался вопросом, а зачем в данном примере io_service в разных потоках