Witam. Mam za zadanie napisać program sortujący wyrazy w C stosując sortowanie przez pozycjonowanie, gdzie sortowanie według kolejnych liter ma być wykonane sortowaniem przez zliczanie. Program działa dobrze dla wyrazów równej długości (np. 4 literowych mama,tata,adam itp.), jednak chciałbym żeby sortował też wyrazy o różnych długościach. Niestety po dodaniu komendy (oznaczonej TUTAJ), która dodaje zera (próbowałem też dodawać spację) jeśli słowa mają krótszą długość od najdłuższego wyrazu program przestaje działać. Czy ktoś wie, gdzie może być błąd ?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_DLUGOSC_WYRAZU 30
void drukuj_tab(char ** tab, int rozmiar_tab) {
int i;
printf("--------------\n");
for (i = 0; i < rozmiar_tab; ++i)
{
printf("%s\n", tab[i]);
}
printf("--------------\n");
}
void sortowanie_pozycyjne(char ** tab, int rozmiar_tab ) {
unsigned int rozmiary[rozmiar_tab], wsk_poz;
int i,j ;
unsigned int max_dl_wyrazu = 0;
// mierzymy dlugosc wszystkich lancuchow
for (i = 0; i < rozmiar_tab; ++i) {
rozmiary[i] = strlen(tab[i]); // dlugosc lancucha
if (rozmiary[i]>max_dl_wyrazu)
{
max_dl_wyrazu = rozmiary[i];
}
** else{ // TUTAJ
for(j=0;j<max_dl_wyrazu;j++)
tab[i][j]=0;
}**
}
char max_znak; // najwiekszy znak tj litera najdalej w alfabecie
char ** tab_pomocnicza = (char**) malloc(sizeof(char *) * rozmiar_tab);
for (i = 0; i < rozmiar_tab; ++i)
{
tab_pomocnicza[i] = (char*) malloc(sizeof(char)*MAX_DLUGOSC_WYRAZU);
}
for (wsk_poz = max_dl_wyrazu-1; wsk_poz >= 0; wsk_poz--)
{
if (wsk_poz == -1){break;}
max_znak=0;
// szykanie maksymalnego znaku
for (j = 0; j < rozmiar_tab; ++j)
{
printf("pozycja = %d a rozmiar = %d\n", wsk_poz, rozmiary[j]);
if (rozmiary[j] > wsk_poz && max_znak<tolower(tab[j][wsk_poz]))
{
max_znak = tolower(tab[j][wsk_poz]);
}
}
printf("max znak = %d\n", (int)max_znak);
int wielkosc_tab_wyn = (int)(max_znak-'a') + 2;
printf("Wielkosc tab wyn = %d\n", wielkosc_tab_wyn);
unsigned int wyniki[wielkosc_tab_wyn]; // przechowuje indeksy kluczy
for (j = 0; j < wielkosc_tab_wyn; ++j) {
wyniki[j] = 0;
}
// sortowanie przez zliczanie
for (j = 0; j < rozmiar_tab; ++j)
{
printf("obliczony index = %d\n", tolower(tab[j][wsk_poz])-'a'+1);
wyniki[tolower(tab[j][wsk_poz])-'a'+1]++;
printf("zwiekszam dla znaku %c, obecnie %d\n",tolower(tab[j][wsk_poz]),wyniki[tolower(tab[j][wsk_poz])-'a'+1]);
}
printf("tablica indeksĂłw\n %d ,", wyniki[0]);
// przeindeksowanie tablicy
for (j = 1; j < wielkosc_tab_wyn; ++j) {
wyniki[j] = wyniki[j-1] + wyniki[j];
printf(" %d ,",wyniki[j]);
}
printf("\n");
// krok 1
for (j = rozmiar_tab-1; j >= 0; --j)
{
printf("dla wyrazu %s chce wrzucic na index - wyniki [ %d ] = %d\n", tab[j], tolower(tab[j][wsk_poz])-'a'+1, wyniki[ tolower(tab[j][wsk_poz])-'a'+1 ]-1);
strcpy(tab_pomocnicza[ wyniki[ tolower(tab[j][wsk_poz])-'a'+1 ]-1 ], tab[j]);
wyniki[ tolower(tab[j][wsk_poz])-'a'+1 ]--;
}
// przerzucanie z tab_pomocniczej do normalnej
for (j = 0; j < rozmiar_tab; ++j)
{
strcpy(tab[j], tab_pomocnicza[j]);
}
drukuj_tab(tab,rozmiar_tab);
}
}
int main() {
int wielkosc_tab, i;
printf("%s\n", "Podaj rozmiar tablicy :");
scanf("%d",&wielkosc_tab);
// dynamiczne alokowanie pamieci dla tablicy
char ** tab = (char **)malloc(sizeof(char*) * wielkosc_tab);
for (i = 0; i < wielkosc_tab; ++i)
{
tab[i] = (char *)malloc(sizeof(char)*MAX_DLUGOSC_WYRAZU);
}
for (i = 0; i < wielkosc_tab; ++i)
{
scanf("%s",tab[i]);
}
sortowanie_pozycyjne(tab, wielkosc_tab);
drukuj_tab(tab,wielkosc_tab);
return 0;
}