Drukowanie tekstu w funkcji

Odpowiedz Nowy wątek
2019-02-16 17:52
0
#include<stdio.h>

int pobierz(int tab[])
{
    int p=0;
    int i=0;
    while(p!='#')
    {
        p=getchar();
        tab[i]=p;
        ++i;
    }
    return i;
}

int licz_ile(int i,int ile[], int tab[])
{
    for(int k=0;k<127;++k)
    {
        ile[k]=0;
    }   

        for(int k=0;k<i;++k)
    {
        ++ile[tab[k]];

    }   
    return 0;
}

int drukuj(int ile[])
{
    printf("\n*********\n");
    int k=0;
    while(k<127)
    {
        if(ile[k]>0)
        {
                if(k==10)
                    printf("enter");
                    else
                    {
                        if(k==32)
                            printf("spacja");
                            else
                            {   
                                if(k==9)
                                    printf("tab");
                                    else
                                    {
                                        putchar(k);
                                        printf("%d",ile[k]);
                                    }
                            }
                    }
            printf(":%d\n",ile[k]);
        }
        ++k;
    }

    return 0;
}

int main()
{   
    int ile[100];
    int tab[100];
    int dlugosc=pobierz(tab);

    licz_ile(dlugosc,ile,tab);
    drukuj(ile);

}

Program ma wypisać liczbę wystąpień poszczególnych znaków, dopóki drukowanie odbywało się w int main() wszystko działało.
Odkąd przeniosłem je do funkcji,przestało działać.
Podejrzewałem że, break przerywało instrukcję, dlatego switch zamieniłem na if else, jednak to nie pomogło.
Proszę o pomoc w ustaleniu przyczyny problemów :')

Pozostało 580 znaków

2019-02-17 01:45

1. Najpierw deklarujesz tablicę na sto elementów: int ile[100];, a potem próbujesz odczytywać ją jakby miała tych elementów aż 127 (dlaczego akurat tyle?):

    while(k<127)
    {
        if(ile[k]>0)
        {

wykroczysz poza zakres przydzielonej Ci pamięci i program się "wywali".

2. Skąd wiesz, ile będzie prób wykonanych przez użytkownika w funkcji pobierz()? Skoro wrzucasz tam tablicę o określonym rozmiarze, to zawsze pamiętaj by ten rozmiar przekazać każdej funkcji, która tej tablicy używa:

int pobierz(int tab[], int rozmiar)
{
    int p=0;
    int i=0;
    while(p!='#' && i < rozmiar)  // Sprawdzamy, czy nie nastąpi przepelnienie tablicy
    {

3. Funkcja licz_ile() to już w ogóle jakaś masakra:
Najpierw zerujesz całą tablicę (pomijam wykraczanie poza zakres magicznych 100 liczb iterując magiczne 127 razy)

    for(int k=0;k<127;++k)
    {
        ile[k]=0;
    }   

Potem próbujesz zrobić coś, co absolutnie nie zadziała tak jak chciałeś:

    for(int k=0;k<i;++k)
    {
        ++ile[tab[k]];
    }

dlatego, że liczysz teraz do i, które nie jest poprawne.
A końcówka dopełnia skalę dziwności :P

return 0;

nawet jeśli zostało po czymś, z czego zrezygnowałeś, to wypada takiego kwiatka usunąć i zmienić typ zwracany przez funkcję na void.

Szczerze mówiąc nie napisałeś nawet co oznacza, że "przestało działać". Wypisuje nie to co trzeba? Nie wypisuje nic? Nie liczy?
Każdemu to piszę, to napiszę i Tobie:

Jak przychodzisz do mechanika, to mówisz, że "coś stuka w prawym kole", "silnik piszczy/klekocze", czy też rzucasz lakonicznie, że "nie działa" i odchodzisz?

Wielkie dzięki, bardzo mi pomogłeś :') - maciej besztocha 2019-02-18 10:29

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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