Newsgroup: it.comp.lang.c
Titolo: getstring

int getstring(FILE* f, char* p, int g)
{int i=0, c;
 while(i<g+1 && (p+i)!=0 && (c=fgetc(f))!=EOF ) 
                           {*(p+i)=(char)c; 
                            ++i;
                            if(c=='\n') break;
                           }
 if((p+i)!=0) *(p+i)='\0';
 else return -1;
 if(i==g+1 && *(p+g)!='\n' ) 
     {while((c=fgetc(f))!='\n' && c!=EOF);
      *(p+g)='\n';
     }
 return i;
}
"int getstrig()" dovrebbe
preleva da FILE una stringa di g caratteri se non incontra '\n', in
tal caso scarta tutto l'input del file fino al primo '\n' o EOF che
incontra (ovvero pulisce il buffer nel caso FILE f=stdin ??????) 
in caso contrario si ferma a '\n' incluso nella stringa. In ogni caso
'\n' è l'ultimo carattere della stringa.
Allocando la memoria nel main sembra ok; vedete qualche errore?
La cosa che non sono riuscito a fare è il far allocare dinamicamente
la quantità di memoria di (g+1) char direttamente nella funzione in
modo che tale memoria possa essere vista anche dal main (e quindi dal
main data l'istruzione getstring(stdin,  p,  g) con char * p definito
nel main posso stampare la stringa dal main attraverso il puntatore p
che accede nell'aria di memoria riservata da getstring)
Non so se mi sono spiegato. Si può fare?
Ho fatto bene a porre la condizione aggiuntiva nel for (p+i)!=0 ??
Il puntatore p che punta ad aree di memoria non allocate, o non
riservate al programma, è nullo (p==0) ? 
Grazie per le eventuali risposte.

On Fri, 18 Jan 2002 17:33:52 GMT, j...@jk.jk (jk) wrote:
#include <stdio.h>
#include <stdlib.h>
int getstring(FILE* f,char* p, int g)
{int i, c;
 if((c=fgetc(f))!=EOF && c=='\n'); /*elimina eventuale \n iniziale*/
 else ungetc(c,f);
 if(c!=EOF) 
   for(i=0;i<g-1 && (p+i)!=0 && (c=fgetc(f))!=EOF && c!='\n'; i++) 
                                       *(p+i)=(char)c;
   /*getline del K&R 0..g-2 n.elementi max qui g-1 */
 if(c=='\n' && (p+i)!=0 ) { *(p+i)='\n'; ++i;}/*max i =g-1*/
 if((p+i)!=0) *(p+i)='\0';/*MAXi=g g+1 posiz. di memoria*/
 else return -1;
 if(i==g-1 && c!='\n' && c!=EOF) /*nel caso di stringa piena e non \n
letto */
     while((c=fgetc(f))!='\n' && c!=EOF); /* elimina la linea*/
 //if(c==EOF) fflush(f);
 return i;/*lunghezza della stringa*/
}
int  main()
{int g, i, h;
 char *pn;
do{printf("\nInserisci un intero:(\"1 \" termina)>");
   scanf("%d", &g);
   printf("\nPartenza=%d\n", g);
   pn=malloc(g);
   h=getstring(stdin, pn, g);
   printf("len=%d \n", h);
   for(i=0; i<g+3; i++) 
        {if(*(pn+i)!='\n') printf("[%d]=%c ", i, *(pn+i));
         else printf("[%d]=\\n ",i);
        }
  printf("\npn=%d\n", pn);
  free(pn);
  }while(g != 1);
return 0;
}
qualcuno di voi sa il motivo per cui se finisco la stringa con EOF
allora  printf("len=%d \n", h); non viene stampata allo schermo?
Sono sicuro che una linea salta; un printf("\n") risolverebbe tutto ma
non ho capito il perchè

int getstring(FILE* f,char* p, int g)
int getstring(FILE* f,char* p, int g)
{int i=0, c;
 if((c=getc(f))=='\n' && c!=EOF); /*elimina eventuale \n iniziale*/
 else ungetc(c,f);
 if(c!=EOF) 
   for(;i<g-1 && (p+i)!=0 && (c=getc(f))!=EOF && c!='\n'; i++) 
                                       *(p+i)=(char)c;
   /*getline del K&R 0..g-2 n.elementi max g-1 */
 if(c=='\n' && (p+i)!=0 ) { *(p+i)='\n'; ++i;}/*[g-1]*/
 if((p+i)!=0) *(p+i)='\0';/*MAXi=g g+1 posiz. di memoria*/
 else return -1;
 if(i==g-1 && c!='\n' && c!=EOF) /*nel caso di stringa piena e non \n
letto */
     while((c=getc(f))!='\n' && c!=EOF); /* elimina la linea*/
 if(c==EOF) printf("\n"); 
 return i;/*lunghezza della stringa*/
}
questo è il massimo che posso fare

On Tue, 22 Jan 2002 12:00:42 GMT, j...@jk.jk (jk) wrote:
int getstring(FILE* f,char* p, int g)
{int i=0, c;/*elimina eventuale \n iniziale*/
 if((c=getc(f))!='\n' && c!=EOF)
                       ungetc(c,f);
 if(c!=EOF) 
   for(;i<g-1 && (p+i)!=0 && (c=getc(f))!=EOF && c!='\n'; i++) 
                                       *(p+i)=(char)c;
   /*getline del K&R 0..g-2 n.elementi max g-1 */
 if(c=='\n' && (p+i)!=0 ) { *(p+i)='\n'; ++i;}/*max i=g-1]*/
 if((p+i)!=0) *(p+i)='\0';/*MAXi=g, g+1 posiz. di memoria*/
 else return -1;
 if(i==g-1 && c!='\n' && c!=EOF) 
/*nel caso di stringa piena e non \n letto */
     while((c=getc(f))!='\n' && c!=EOF); /* elimina la linea*/
 if(c==EOF && f==stdin) printf("\n"); 
