• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja sprawdzająca zawartość małych liter w wyrazie stringu

Object Storage Arubacloud
0 głosów
277 wizyt
pytanie zadane 2 września 2017 w C i C++ przez Iamhexi Obywatel (1,330 p.)

bool isLoginCorrect(string login){
  for(int i=0;i>login.length();i++){  //special chars 33-47, 58-64, 91-96, 123-126
        if((login[i] >= 33 && login[i] <= 47) || (login[i] >= 58 && login[i] <= 64) || (login[i] >= 91 && login[i] <= 96) || (login[i] >= 123 && login[i] <= 126))return false;
    }
    else return true;

}

Z założenia login nie zawierać znaków specjalnych. Oto funkcja, która ma sprawdzać poprawność tego założenia.

Podaję jakiś ciąg, który zawiera mały znak alfabetu - zwraca false. Sprawdziłem, że sam warunek jakoś nie działa. Jak prawidłowo powinien wyglądać warunek, aby odnajdował mi znak specjalny? Chyba chodzi tu o przekonwertowanie login[i] do int'a lub chara, ale to również mi nie działało. 
Z góry dziękuję za pomoc :)

1
komentarz 2 września 2017 przez niezalogowany
przywrócone 3 września 2017 przez criss

Takie tam gotowe funkcje na później: link ;)

2 odpowiedzi

0 głosów
odpowiedź 2 września 2017 przez Ehlert Ekspert (212,670 p.)
wybrane 2 września 2017 przez Iamhexi
 
Najlepsza
i<login.length();
komentarz 2 września 2017 przez Ehlert Ekspert (212,670 p.)

Jest wiele lepszych sposobów na iteracje po składowych typu string:

std::string login = /*...*/;

//1, c++11
for (char & a : login)
{

}

//2 auto c++11, std::string::iterator wcześniej
for (auto it = login.begin(); it != login.end(); ++it)
{
    //*it - char
}

 

komentarz 2 września 2017 przez Ehlert Ekspert (212,670 p.)
Poza tym nie sprawdzaj tego w ten sposób. Zdaje się, że od wersji 11 są regexy.

http://www.cplusplus.com/reference/regex/regex/
0 głosów
odpowiedź 2 września 2017 przez mokrowski Mędrzec (155,460 p.)

Pewnie znalazło by się jeszcze wiele innych sposobów..

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <regex>
#include <cctype>

bool check_regex(const std::string& login) {
    // Wyłącznie małe litery ASCII
    std::regex pattern{R"!(^[a-z]+$)!"};
    return std::regex_match(login, pattern);
}

bool check_all_of(const std::string& login) {
    // Wszystkie znaki spełniają kryterium są małą literą ASCII
    return std::all_of(login.cbegin(), login.cend(), [](const char ch) {
            return std::islower(ch);
    });
}

bool check_count_if(const std::string& login) {
    // Ilość małych liter jest taka sama jak liter loginu 
    return static_cast<long>(login.length()) == std::count_if(login.cbegin(), login.cend(),
        [](const char ch) {
            return std::islower(ch);
    });
}

void run_test(const std::string& func_name,
        bool (*func)(const std::string&),
        const std::vector<std::string>& login_tests) {

    std::cout << func_name << '\n' << std::string(20, '-') << '\n';
    for(const auto& str: login_tests) {
        std::cout << str << std::boolalpha << '\t' << func(str) << '\n';
    }
    std::cout << std::string(20, '-') << '\n';
}

int main() {
    const std::vector<std::string> login_tests = {
        "amber", "mąka", "9gupy", "Supr", "raq!dan"
    };
    run_test("check_regex()", check_regex, login_tests);
    run_test("check_all_of()", check_all_of, login_tests);
    run_test("check_count_if()", check_all_of, login_tests);
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,666 wizyt
0 głosów
1 odpowiedź 799 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez saju13013 Nowicjusz (230 p.)
0 głosów
1 odpowiedź 430 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...