File: Stare vježbe/vjezbe10/62__malloc_stringovi.c

  1. /*
  2.   62__malloc_stringovi.c
  3.   Rad s dinamicki alociranim stringovima, funkcija realloc.
  4.   -----
  5.   Program unosi liniju po liniju s standardnog ulaza, spremajuci pritom
  6.   unesene linije u jedan zajednicki string za kojeg dinamicki alocirava
  7.   memorija.
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <malloc.h>
  13. #include <string.h>
  14.  
  15. #define EXTRA 20
  16.  
  17. int alocirano = 0;
  18. int popunjeno = 0;
  19. char* string = NULL;
  20.  
  21. void check(void* p) {
  22. if(p == NULL) {
  23. printf("Greska u alokaciji memorije!\n");
  24. exit(1);
  25. }
  26. }
  27.  
  28. void spremi(char* s) {
  29. int len = strlen(s);
  30. if(popunjeno+len > alocirano) {
  31. /* Ukoliko je potrebno alociramo po potrebi jos memorije */
  32. if(alocirano == 0){
  33. string = (char*) malloc((len+EXTRA)*sizeof(char));
  34. check(string);
  35. strcpy(string, s);
  36. alocirano += (len+EXTRA)*sizeof(char);
  37. /* Popunili smo len+1 znakova (moramo pribrojiti i terminirajuci
  38.   '\0' karakter) */
  39. popunjeno += len+1;
  40. }
  41. else {
  42. string = (char*) realloc(string,
  43. (alocirano+(len+EXTRA)*sizeof(char)));
  44. check(string);
  45. strcat(string, s);
  46. alocirano += (len+EXTRA)*sizeof(char);
  47. popunjeno += len;
  48. }
  49. }
  50. else {
  51. strcat(string, s);
  52. popunjeno += len;
  53. }
  54. printf("Alocirano: %d, popunjeno: %d\n", alocirano, popunjeno);
  55. }
  56.  
  57. void ispisi() {
  58. printf("\nIspis-> %s\n" , string);
  59. }
  60.  
  61. void oslobodi() {
  62. free(string);
  63. }
  64.  
  65. int main() {
  66. char line[80];
  67.  
  68. while (gets(line) != NULL)
  69. spremi(line);
  70. ispisi();
  71. oslobodi();
  72.  
  73. return 0;
  74. }
  75.