macierz char, alokacja pamięci...

0

Witam!
Jako że są to moje pierwsze kroki w tym języku, proszę o pomoc.

 
#include <stdio.h>
#include <stdlib.h>
 
/*
 * 
 */
void reverse(int *tab, int size ){
    int b=0,tmp;
 
    size=size-1;
 
    while(size>=b){
        tmp=tab[size];
 
        tab[size]=tab[b];
        tab[b]=tmp;
 
        size=size-1;
        b=b+1;      
    }
}
 
void prepare(char **words, int size){
    int x,y,a;
    int dlugosc_wyrazu[size];
    int min;/*indeks przy sprawdzaniu który najkrótszy wyraz*/
 
    for(y=0;y<size;y++){
        for(x=0;x<25;x++){
                if (words[y][x]=='\0'){
                        break;
        }
        dlugosc_wyrazu[y]=x+1;
        }  
    }
    /*przejażdza cała tablice znajduje najwiekszy wciska go pod 1 elm*/
    /*
    char *tmp;
    int dl_tmp;
    int zmiana;
    tmp=malloc(sizeof(char)*1);
    min=0;
    for(x=0;x<size;x++){
        for(y=x;y<size;y++){
                if(dlugosc_wyrazu[y]<dlugosc_wyrazu[min]){
                        min=y;
                        zmiana=1;
                }
                else{
                        zmiana=0;
                }       
        }
        printf("%d\n",min);
 
        if (zmiana==1){
        tmp=realloc(tmp,sizeof(char)*dlugosc_wyrazu[x]+1);
        for(a=0;a<dlugosc_wyrazu[x];a++){
            tmp[a]=words[x][a];   
        }
 
        words[x] = realloc(words[x],sizeof(char)*dlugosc_wyrazu[min]+1);
        for(a=0;a<dlugosc_wyrazu[min]+1;a++){
            words[x][a]=words[min][a];
        }
 
        words[min] = realloc(words[min], sizeof(char)*dlugosc_wyrazu[x]+1);
        for(a=0;a<dlugosc_wyrazu[min]+1;a++){
            words[min][a]=tmp[a];
        }
 
        dl_tmp=dlugosc_wyrazu[x];
        dlugosc_wyrazu[x]=dlugosc_wyrazu[min];
        dlugosc_wyrazu[min]=dl_tmp;      
        }
        min++;
    }
    */
    /*szukam najkrótszego*/
 
    min=0;
    int tmp;
    for(a=0;a<size-1;a++){
        if(dlugosc_wyrazu[a]>dlugosc_wyrazu[a+1]){
            min=a+1;
        }
    }
    if(min!=0){
 
    tmp=*words[0];
    *words[0]=*words[min];
    *words[min]=tmp;
 
    }
 
    /*Wyświetl*/
    printf("Uporządkowane wyrazy :)\n");
    for(x=0;x<size;x++){
        for(y=0;y<dlugosc_wyrazu[x];y++){
            printf("%c",words[x][y]);    
        }
        printf("\n");
    }  
}
 
int main(int argc, char **argv) {
 
    int size;
    size=atoi(argv[1]);
 
    int *tab;
    tab=malloc(sizeof(int)* size);
    int a,wylosowana;
    srand(time(0));
 
    for(a=0;a<size;a++){
        wylosowana = 0 + rand() % 100;
        tab[a]=wylosowana;
    }
    printf("Przed działaniem funkcji!\n");
    for(a=0;a<size;a++){
        printf("Element nr. %d to liczba: %d \n",a,tab[a]);
    }
    printf("\n");
    reverse(tab,size);
    printf("Po działaniu funkcji!\n");
    for(a=0;a<size;a++){
        printf("Element nr. %d to liczba: %d \n",a,tab[a]);
    }
    free(tab);
 
    /*
     tablica charów :P
    */
    int l;
    char wyraz[25];
    int dlugosc;
 
    char **words;
    words=malloc(size);
 
    for(a=0;a<size;a++){
        printf("\nPodaj wyraz: \n");
        gets(wyraz);
        dlugosc=strlen(wyraz);      
        words[a]=malloc(sizeof(char)*dlugosc); 
        for(l=0;l<dlugosc;l++){
            words[a][l]=wyraz[l];
        }
    }
    prepare(words,size);    
 
    return (EXIT_SUCCESS);
}

Treść
1.
Program losuje tablicę N liczb. Utworzyć funkcję, która przyjmuje jako parametr tablicę i jej rozmiar.
Funkcja odwraca kolejność elementów tablicy:
void reverse(int array[], int size);
Program powinien wypisać zawartość tablicy na ekran przed i po działaniu funkcji.

Program wczytuje od użytkownika N słów (char*). Utworzyć funkcję, która przyjmuje jako parametr
tablicę słów i jej długość. Funkcja układa słowa od najkrótszego do najdłuższego.
void prepare(char** words, int size);

Pierwszy program myśle że jest ok.

W drugim problem prawdopodobnie tkwi w tworzeniu macierzy charów, alokacji pamięci.

Znając długości danych wyrazów. Chciałbym za pomocą przepisania wskaźników aby wskazywały na dane wyrazy w odpowiedniej kolejności.

Przepraszam za mało czytelny kod.
Za każdą pomoc z góry dziękuję.
Pozdrawiam

0

Nie chce mi się czytać długaśnego kodu, a Ty nie napisałeś co jest nie tak w wyniku, więc zajmę się szczytem piramidy błędów.
Najważniejsze, nie używaj gets(). Nie wiem dlaczego uczą tego w szkołach, biorąc pod uwagę jaką krzywdę można sobie tym zrobić (coś działa źle, ale nie wiadomo dlaczego). Nie masz kontroli nad tym ile znaków zostanie zapisane w tablicy. Jak ktoś wpisze więcej niż jest ona w stanie zmieścić, program albo Ci się wywali, albo gets() bez żadnych oporów nadpisze Ci inne zmienne. I nie, nie chcesz tego.
Kolejna sprawa, zapomniałeś o bajtach zerowych. Funkcja strlen() zwraca Ci długość z pominięciem terminatora. Przykładowo, dla ciągu "Ala ma kota" funkcja zwróci 11, pomimo że w rzeczywistości zajmuje on 12 znaków ("Ala ma kota\0"). Musisz zatem malloc()iem zaalokować dlugosc + 1 bajtów. Potem jeszcze bardziej sobie to psujesz kopiując znak po znaku (pętla for). Gdybyś użył strncpy(), miałbyś poucinane wyrazy (o jeden znak), ale przynajmniej byłyby one prawidłowo zakończone bajtem zerowym.

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