[ amanteo @ 21.03.2010. 00:58 ] @
Pozdrav svima,
Potrebna mi je konkretna pomoć u vezi sledećeg problema:
Hteo bih da skapiram kako predajem nizove stringova
funkcijama pomoću pokazivača pa sam probao sledeće:
Code:

#include <stdio.h>
#include <string.h>
#define BROJEL 5         // maksimalan broj elemenata niza
#define LIMIT 10         // maksimalan broj slova u stringu

/*** Deklaracija funkcija **************************************/

 void readString(char *p[]);
 void printString(char *p[]);

/*** Glavna funkcija *******************************************/
int main()
{
    char *string[BROJEL];
    readString(string);
    printString(string);
    return 0;
    }

/*** Funkcija kojom se cita niz stringova sa standardnog ulaza */
 void readString(char *p[])
 {
     int i;
     for(i=0;i<BROJEL;i++)
     {
         printf("%d. string:",i);
         fgets(*p[i],LIMIT,stdin);
         }
     }


/*** Funkcija kojom se stampa niz stringova na standardni izlaz*/
 void printString(char *p[])
 {
     int i;
     for(i=0;i<BROJEL;i++)
     {
         fputs(*p[i],stdout);
         putchar('\n');
         }
     }

...Međutim kao i nekoliko puta pre ovog primera dobijam 2 warning-a:

warning: passing arg 1 of `fgets' makes pointer from integer without a cast
warning: passing arg 1 of `fputs' makes pointer from integer without a cast

Molio bih vas da mi neko pojasni u čemu grešim u vezi sa datim argumentima
funkcija jer mi je veoma stalo da ovo savladam, hvala unapred !
[ X Files @ 21.03.2010. 07:09 ] @
Evo jedan mali primer baziran na tvom kodu. Kod fputs, ne treba ti pointer, obracas se konkretnom stringu koji je vec sam po sebi pointer. Takodje, velicinu niza stringova mozes odrediti dinamicki, pod uslovom da je definisan na ovaj nacin.

Code (c):

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

char *niz_stringova[] = { "jedan", "dva", "tri", "cetiri", "pet" };

void printString( char *p[] )
{
    int i;
    for( i=0; i<sizeof(niz_stringova)/sizeof(char*); i++ )
    {
        fputs( p[i],stdout );
        putchar('\n');
    }
}

int main(void)
{
    printString( niz_stringova );
    return 0;
}
 
[ amanteo @ 25.03.2010. 11:19 ] @
Da napravio sam par sintaksnih greški i jednu veliku logičku
koja me muči već nedeljama...
Ja ne želim da inicijalizujem elementarne stringove kao string konstante:
Code:

char *niz_stringova[] = { "jedan", "dva", "tri", "cetiri", "pet" };

U svim primerima koje sam sretao u knjigama L.Krausa i M.Čabarkape
kao i brojnih stranih autora (dakle očigledno da sam nešto sistemski propustio)
uvek se inicijalizuju nizovi stringova unapred na gorenaveden način.
Ono što ja želim je da svaki elementarni string unosim sa tastature i
interesuje me kako to da izvedem pomoću funkcije fgets a da mi program
ne puca posle prvog unetog stringa što mi se trenutno dešava.

Deklaracija niza stringova u main funkciji:
Code:

char *string[BROJEL];

...govori o tome koliki je broj stringova konstantom BROJEL ali
kako da odredim broj karaktera (bajtova) koji svaki string zauzima?

Mislim da mi to uzrokuje pucanje programa nakon prvog unosa u funkciji:
Code:

/*** Funkcija kojom se cita niz stringova sa standardnog ulaza */
 void readString(char *p[])
 {
     int i;
     for(i=0;i<BROJEL;i++)  
     {
         printf("%d. string:",i);
         fgets(p[i],LIMIT,stdin); 
         }
     }

[ amanteo @ 26.03.2010. 17:18 ] @
Evo rešenja,uz veliku pomoć prijatelja,
zašto su problemi tako komplikovani a
rešenja tako j... jednostavna!
Code:

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

#define BROJEL 5         // maksimalan broj elemenata niza
#define LIMIT 10         // maksimalan broj slova u stringu

/*** Deklaracija funkcija **************************************/

 void readString(char *p[]);
 void printString(char *p[]);
 void clearMemory(char *p[]);

/*** Glavna funkcija *******************************************/
int main()
{
    char *string[BROJEL];
    readString(string);
    printString(string);
    clearMemory(string);
    return 0;
}

/*** Funkcija kojom se cita niz stringova sa standardnog ulaza */
 void readString(char *p[])
 {
     int i;

     for(i=0;i<BROJEL;i++)
     {
         printf("%d. string:",i);
         p[i]=(char*)malloc(10*(sizeof(char)));
         fgets(p[i],10,stdin);
     }
 }


 /*** Ne zaboravi da obrises memoriju s heap-a da ne bi doslo do memory leak-a*/
 void clearMemory(char *p[])
 {
     int i;
     for(i=0;i<BROJEL;i++)
         free(p[i]);
 }

/*** Funkcija kojom se stampa niz stringova na standardni izlaz*/
 void printString(char *p[])
 {
     int i;
     for(i=0;i<BROJEL;i++)
     {
         puts(p[i]);
         putchar('\n');
     }
 }