Drukowanie tekstu w funkcji

Drukowanie tekstu w funkcji
KU
KU
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:13
0
Kopiuj
#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 :')

Bartosz36
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:348
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?):

Kopiuj
    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:

Kopiuj
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)

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

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

Kopiuj
    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

Kopiuj
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?


ExtendedVector czyli std::vector<T> z wygodą List<T> z .NET (ForEach, FindAll, itd...)
KU
konto usunięte
Wielkie dzięki, bardzo mi pomogłeś :')

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.