Najczęściej występujący znak w łańcuchu

0

Hej :)
Mam program, który ma wczytywać ciąg znaków i wypisać ten, który powtarza się najczęściej, tylko coś jest nie tak. Niezależnie od wprowadzonego ciągu znaków, wyświetla taki sam wynik. Dodam, że wyświetla znak, który nawet nie jest zawarty w tym ciągu. Mógłby ktoś na to rzucić okiem i podpowiedzieć co jest źle?

#include <stdio.h>
#include <stdlib.h>
/*Wczytuje ci¹g znaków i pisze znak, który powtarza siê najczêœciej (bez sortowania).*/
int main()
{
    int i, n;
    n=100;
    char *tekst = (char* ) malloc(n * sizeof(char));
    printf("Podaj ciag znakow: \n");
    while( scanf("%c", &tekst[i]) == 1 )
    {
        if( tekst[i]=='\n' )
            break;
        ++i;
    }

    int max, indeks;
    int *tab = (int*) malloc(n * sizeof(int));
    int najwiekszy_licznik, najczestszy_znak, licznik, j;
    najwiekszy_licznik=0;
    for(i=0; i<n; i++)
    {
        licznik=0;
        for (j=0; j<n; j++)
        {
           if(tekst[i]==tekst[j])
           {
               licznik++;
                if(licznik>najwiekszy_licznik)
                {
                    najwiekszy_licznik=licznik;
                    najczestszy_znak=tekst[i];
                }
           }

        }

    }
    printf("Najczesciej wystepujacy znak to '%c'. Wystepuje on '%d' razy.", najczestszy_znak, najwiekszy_licznik);
    free(tekst);
    free(tab);

    return 0;
}
2

Próbujesz użyć niezainicjalizowanej zmiennej i. Undefined Behaviour.

int i;
...
while (scanf("%c", &tekst[i]) == 1)

Dziwne jest to:

int najczestszy_znak;

zamiast

char najczestszy_znak

A problem występuje dlatego, że gdy wpiszesz np. sweter (6 znaków) to i tak lecisz pętlą 100 razy, czytasz bzdury i je liczysz.

0

Jak zrobić, żeby pętla wykonała się tylko tyle razy, ile znaków ma ciąg?

0

Okej, już mi się udało. Dzięki za pomoc. :)
A co, gdy na przykład dwie literki powtarzają się 3 razy? Trzeba jakąś pętlę if zastosować?

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