Вопрос:
Существует ли метод проверки этих случаев? Или мне нужно проанализировать каждую букву в строке и проверить, является ли она более низкой (буква) и является числом/буквой?
благодарю!
Лучший ответ:
Вы можете использовать islower(), isalnum() для проверки этих условий для каждого символа. Для этого нет функции уровня строки, поэтому вам придется писать свои собственные.
Ответ №1
Предполагая, что язык “C” является приемлемым (или find_first_not_of() другим набором символов для criteria), используйте find_first_not_of()
#include <string> bool testString(const std::string& str) { std::string criteria(«abcdefghijklmnopqrstuvwxyz0123456789»); return (std::string::npos == str.find_first_not_of(criteria); } Ответ №2
Это не очень хорошо известно, но локаль действительно имеет функции для определения характеристик целых строк за раз. В частности, фасет ctype локали имеет scan_is и scan_not которые сканируют первый символ, который соответствует указанной маске (альфа, числовая, буквенно-цифровая, нижняя, верхняя, пунктуация, пробел, шестнадцатеричная цифра и т.д.) Или первый что не соответствует ему, соответственно. Помимо этого, они работают немного как std::find_if, возвращая все, что вы передали, как “конец” для отказа сигнала, в противном случае возвращаете указатель на первый элемент строки, который не подходит к тому, что вы просили.
Вот пример:
#include <locale> #include <iostream> #include <iomanip> int main() { std::string inputs[] = { «alllower», «1234», «lower132», «including a space» }; // We’ll use the «classic» (C) locale, but this works with any std::locale loc(std::locale::classic()); // A mask specifying the characters to search for: std::ctype_base::mask m = std::ctype_base::lower | std::ctype_base::digit; for (int i=0; i<4; i++) { char const *pos; char const *b = &*inputs[i].begin(); char const *e = &*inputs[i].end(); std::cout << «Input: » << std::setw(20) << inputs[i] << «:t»; // finally, call the actual function: if ((pos=std::use_facet<std::ctype<char> >(loc).scan_not(m, b, e)) == e) std::cout << «All characters match maskn»; else std::cout << «First non-matching character = «» << *pos << «»n»; } return 0; }
Я подозреваю, что большинство людей предпочтут использовать std::find_if хотя – используя его почти то же самое, но его можно легко обобщить на многие другие ситуации. Хотя это имеет гораздо более узкую применимость, на самом деле это не намного проще для пользователя (хотя я полагаю, что если вы сканируете большие фрагменты текста, это может быть, по крайней мере, немного быстрее).
Ответ №3
Вы можете использовать tolower & strcmp для сравнения, если original_string и tolowered string.And делают числа отдельно для каждого символа.
(ИЛИ) Сделайте оба символа, как показано ниже.
#include <algorithm> static inline bool is_not_alphanum_lower(char c) { return (!isalnum(c) || !islower(c)); } bool string_is_valid(const std::string &str) { return find_if(str.begin(), str.end(), is_not_alphanum_lower) == str.end(); }
Я использовал некоторую информацию из: Определите, содержит ли строка только буквенно-цифровые символы (или пробел)
Ответ №4
Если ваши строки содержат ASCII-кодированный текст, и вам нравится писать свои собственные функции (например, я), вы можете использовать это:
bool is_lower_alphanumeric(const string& txt) { for(char c : txt) { if (!((c >= ‘0’ and c <= ‘9’) or (c >= ‘a’ and c <= ‘z’))) return false; } return true; }