Pokial poznas pocet slov a ich maximalnu dlzku este pred prekladom tak ti staci definovat pole tak ako ti to napisal harrison314: "char slova[50][50];".
To znamena ze by si mohol mat 50 slov s dlzkou maximalne 49 znakov (nezabudnut na ukoncovaci znak '\0') potom v cykle uz len iterovat a kopirovat stringy ako "strcpy(slova[pocitadlo], line);"
Ak nepoznas velkost ani dlzku tak potom potrebujes dynamicky alokovat pamat pre to pole. POuzivaju sa na to funkcie malloc alebo calloc, popripade pre zvacsenie vyhradenej pamate sa pouziva realloc.
Priklad:
Kód: Vybrať všetko
char **pole;
pole = (char **) calloc(pocet_slov, sizeof(char *));
tymto si si ako keby vytvoril pamat pre "riadky", to znamena ze teraz mozes pristupovat k jednotlivym riadkom ako pole[cislo_riadku]. Ked teraz pristupis na nejaku hodnotu napriklad pole[1] tak je tam hodnota NULL cize tam nic nie je
mame teda vytvorene miesto pre urcity pocet slov. aby si mohol na toto miesto nakopirovat nejaky string, musis naalokovat este aj miesto pre ten konkretny retazec. Na to budes potrebovat vediet dlzku toho stringu ktoru ti vrati funkcia getline (vrati ti pocet znakov v riadku ale asi mas kazde meno na jeden riadok) + budes potrebovat naalokovat o jeden znak viacej prave kvoli ukoncovaciemu znaku.
Kód: Vybrať všetko
pole[cislo_riadku] = (char *) calloc(dlzka_riadku + 1, sizeof(char));
takze teraz mas naalokovane miesto pre jeden konkretny string o dlzke dlzka_riadku + 1 na pozicii cislo_riadku
pre kopirovanie stringov pouzijes funkciu strcpy(ciel, zdroj);
strcpy(pole[cislo_riadku], zdroj_odkial_kopirujes);
Tvoje zadanie:
Kód: Vybrať všetko
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char **slova = NULL;
char * line = NULL;
size_t len = 0;
ssize_t read;
FILE * fp = fopen("mena.txt", "r");
if (fp == NULL)
{
exit(EXIT_FAILURE);
}
int pocitadlo = 0;
while ((read = getline(&line, &len, fp)) != -1) {
pocitadlo++; //inkrementujeme pocitadlo podla ktoreho budeme realokovat pamat
slova = (char **) realloc(slova, pocitadlo * sizeof(char *));
slova[pocitadlo-1] = (char *) calloc(read + 1, sizeof(char));
printf("Retrieved line of length %zu :\n", read);
printf("%s", line);
strcpy(slova[pocitadlo - 1], line);
}
fclose(fp);
return 0;
}
}
Samozrejme pri alokacii pamate treba este osetrit, ci nam alkoacia prebehla uspesne... premennu kontrolujeme na NULL ak nam pri alokacii calloc realloc alebo malloc vrati NULL, alokacia sa nepodarila.
Uvolnovanie pamate funkciou free sa robi opacne, najskor uvolnime string a potom "riadok" na ktorom ten string bol.
Kod som netestoval ale mal by ist.
S pozdravom
Peter