[ zokio @ 01.08.2005. 14:11 ] @
Pozdrav svima ! ! !
Muči me sljedeći zadatak ! ! !


Napisati program koji će učitavati liniju po liniju, te svaku liniju spremiti u polje pokazivača na char tip podataka. Svaku liniju treba smjestiti u sljedeći član polja, te za svaku liniju alocirati točno određeni memorijski prostor


Naime napisao sam nekakav code ali mi compiler nejavlja grešku nego windows (send, don't send), nemogu naći grešku jel mi baš nije jasno korištenje polja pointera i uvrštavanje stringova u njih, pa bi bilo dobro ako tko ima kakav dobar link za literaturu o tome;

UNAPRIJED HVALA! ! !

evo moga pokušaja ! ! !

Code:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()

{
int i,j,brc=0;
char *str[10];
char *buffer;

if((buffer=malloc(80))==NULL){
puts("Neuspjesno alociranje memorije");
exit(0);}
else
puts("Uspjesno alociranje memorije");
for(j=0;j<3;){
puts("\n\nUtipkajte niz znakova i za kraj pritisnite Enter\n");
gets(buffer);
strcpy(str[j++],buffer);
free(buffer);
brc++;
}
for(i=0;i<brc;)
printf("%s",str[i++]);
}
[ rumpl @ 01.08.2005. 14:29 ] @
Pazi, lepo si poceo, samo sto str treba da bude str**, mallocuj buffer na 1024, na primer, moze i vise, i za svaku liniju -> read(0, buffer, strlen(buffer));

U trenutku kada imas tvoju liniju u buffer, za str** mozes da alociras tacno onoliko memorije koliko ti treba... I na kraju free(buffer), i to sve stavis u petlju....

Nadam se da sam bio barem malo jasan...
[ leka @ 01.08.2005. 20:17 ] @
Zokio, problem je bio sto si free(buffer) stavio na pogresno mesto. U prvoj iteraciji se memorija oslobadja, tako da program u drugoj iteraciji puca jer se poziva free(buffer) (nesto sto ne postoji, jer je u prethodnoj iteraciji ta memorija oslobodjena).
Evo programa koji radi, ali nije savrsen... :)

Code:

/*********************************************************\
file:        zokio01.cpp
description: Zokio problem No1
compile:     g++ zokio01.cpp -o zokio01
run:         ./zokio01
author:      zokio
corrections: Dejan Lekic, http://dejan.lekic.org
\*********************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main (int argc, char **argv)
{
  int i, j, brc = 0;
  char *str[10];
  char *buffer;

  if ((buffer = (char*)malloc(1024)) == NULL) {
    puts ("Neuspjesno alociranje memorije");
    exit (0);
  } else {
    puts ("Uspjesno alociranje memorije");
  }
  for (j = 0; j < 3; j++) {
    puts ("\n\nUtipkajte niz znakova i za kraj pritisnite Enter\n");
    // pod pretpostavkom (losom) da je buffer dovoljno velik koristicemo gets()
    // koji treba izbegavati uvek.
    gets (buffer);
    // Alociraj dovoljno memorije na heap-u da se u to parce moze smestiti
    // novouneseni string
    str[j] = (char*)malloc(strlen(buffer));
    // Iskopiraj bajtove iz bafera "buffer" u novokreirano memorijsko polje u heap-u
    strcpy (str[j], buffer);  // U principu je sigurnije koristiti strncpy() ...
    brc++;
  }
  // buffer nam vise ne treba
  free (buffer);
  for (i = 0; i < brc;)
    printf ("%s", str[i++]);
  // ovde bi trebalo eventualno "pobrisati" sve djubre iz memorije...
} // main() funkcija

Evo i primera rada:

dejan@gnu ~/prj/cxx/es
$ g++ -g zokio01.cpp -o zokio01 && ./zokio01
/tmp/ccyP4ghf.o(.text+0x8d): I funktionen "main":
/home/dejan/prj/cxx/es/zokio01.cpp:31: warning: the `gets' function is dangerous and should not be used.
Uspjesno alociranje memorije


Utipkajte niz znakova i za kraj pritisnite Enter

ES rulz


Utipkajte niz znakova i za kraj pritisnite Enter

Gojko rulz


Utipkajte niz znakova i za kraj pritisnite Enter


ES rulzGojko rulz


[Ovu poruku je menjao leka dana 01.08.2005. u 21:19 GMT+1]