Zlicznie różnic w tablicy *char.

0

Jest to mój pierwszy post na tym forum więc witam wszystkich.

Mam problem z napisaniem programu w C, który podawałby ile różnych znaków występuje w podanej tablicy *char. Generalnie w programie chodzi o napisanie funkcji, która sprawdzałaby poprawność hasła i takie sprawdzenia jak wyszukanie czy występuje mała litera, duża litera, znak specjalny, itd. udało mi się napisać bez problemu (w C są specjalne fukcje do tego służące). Zaciąłem się jednak na tym jednym, ostatnim teście, który ma na celu sprawdzenie czy w haśle jest odpowiednia ilość różnych znaków :/ Próbowałem kombinować z funkcją strchr, różnych kombinacji z for i porównywaniem elementów ale póki co nie powstał żaden sensowny kod. Proszę o jakąś podpowiedź jak można to rozwiązać i w którym kierunku szukać.
Mam jakiś pomysł na to, żeby posortować znaki w tablicy jako inty (czyli zrzutowanie char na int, wtedy będę miał wartości liczbowe znaków w ASCII). W takiej posortowanej tablicy powinno dać się łatwiej policzyć różnice. Czy ma to sens? A może jest jakiś prostszy sposób?

Pozdrawiam.

1

Hm chodzi o to żeby przy np wymogu 3 różnych znaków odrzuciło chasło sssssssssssssossssssosooooooooo? Jak tak to można zrobić dodatkową tablicę, sprawdzać czy dany znak już tam jest. Jak nie to go tam dodać, Na koniec sprawdzasz ile elementów jest w tablicy i porównać to z wymogiem. Albo zrobić "kopię" hasła i usuwać z niej powtarzające się znaki.

1

Nie ma potrzeby sortowania, można to zrobić przez zwykłe zliczanie, np. w taki sposób (zakładam że w haśle są znaki z podstawowego ASCII – [0..127]):

int count_diff(const char* str) {
    char ascii[128] = {0};
    int i, cnt = 0;
    while (*str)
        ++ascii[*str++];
    for (i = 0; i < 128; ++i)
        if (ascii[i])
            ++cnt;
    return cnt;
}
0
sig napisał(a):

Hm chodzi o to żeby przy np wymogu 3 różnych znaków odrzuciło chasło sssssssssssssossssssosooooooooo?

Tak, dokładnie o to chodzi. Dzięki za odpowiedź, pomysł z dodatkową tablicą brzmi ciekawie :)

0

Okej, dziękuję Wam bardzo za pomoc. Liczyłem co najwyżej na podpowiedź a dostałem dużo więcej :D Oba sposoby działają wyśmienicie, jeszcze w wolnej chwili spróbuję klepnąć to na sposób siga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1