Drukowanie tekstu w funkcji

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 :')

1

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?

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