====== fmlcat : una funzione per concatenare stringhe ====== Autori: **//Fabio Di Matteo, Santo Patti //** \\ Ultima revisione: **//31/07/08//** \\ \\ Due funzioni per concatenare stringhe di puntatori a char. Le funzioni restituiscono una stringa di puntatori a char (char*) generata dalla concatenazione di un numero arbitrario di stringhe. ===== I prototipi ===== ==== nfmlcat ==== char* nfmlcat(int nstr ,char* s1, ...) ''nstr'' e' il numero di stringhe che devono essere concatenate, ''s1'' èla prima stringa. ==== fmlcat ==== char* fmlcat(char* s1, ...) **N.B. lultima stringa deve essere una stringa vuota "" oppure del testo tra doppi apici, ma in ogni caso non una variabile puntatore a char ** ===== nfmlcat e fmlcat ===== #include #include #include char* nfmlcat(int nstr ,char* s1, ...){ va_list ap ; char *p, *s_tot,*s_res, *format=malloc(sizeof(nstr*2)) ; int i, len=sizeof(s1); /*Conteggio la lunghezza di ogni stringa */ va_start(ap,s1); for(p=s1;*p;p++) len+=sizeof(va_arg(ap, char*)); va_end(ap); /*fine conteggio*/ /*la stringa totale (s_res) avra' dimesioni pari a quella di s1 + len*/ s_tot=malloc(len+sizeof(s1)); s_res=malloc(len+sizeof(s1)); strcat(s_tot,s1); for (i=1;i<=nstr-1;i++) strcat(format, "%s"); vsprintf (s_tot, format, ap ); strcat(s_res,s1); strcat(s_res,s_tot); return s_res; } char* fmlcat(char* s1, ...){ va_list ap ; char *p ; int i , len=strlen(s1); /*Conteggio della memoria necessaria*/ va_start(ap,s1); for(p=s1;*p;p++) len+=strlen(va_arg(ap, char*)); va_end(ap); /*fine conteggio*/ /*la stringa totale avra' dimesioni pari a quella di s1 + len*/ char *s_tot=malloc(len); strcat(s_tot,s1); /*Concateno ogni stringa a s_tot */ va_start(ap,s1); for(p=s1;*p ;p++)strcat(s_tot,va_arg(ap,char*)); va_end(ap); /*pulisco s_tot*/ for (i=0; i<=strlen(s_tot);i++) \ if (!isprint(s_tot[i]) ) s_tot[i]=NULL ; return s_tot; } ===== Usare nfmlcat e fmlcat ===== int main(int argc, char* argv[]){ char* s1="Prima stringa "; char* s2="seconda stringa"; char* s3=" terza stringa"; char* s4=" quarta stringa "; char* s5="quinta stringa"; char* s6=" sesta stringa!'"; /*Usiamo nfmlcat*/ char* st1=nfmlcat(6,s1,s2,s3, s4,s5,s6); printf("%s\n", st1); /*Usiamo fmlcat, come gia' detto l'ultimo parametro *e' una stringa vuota*/ char* st2=fmlcat(s1,s2,s3, s4,s5,s6,""); /*Facciamo dei test sulle stringhe*/ if (strcmp(st1, st2)==0){ printf("----\nStringhe uguali\n"); }else{ printf("----\nStringhe NON uguali\n"); } printf("Lunghezza st1-> %d\n", strlen(st1)); printf("Lunghezza st2-> %d\n", strlen(st2)); return 0; } ===== Migliorie che vorremmo apportare ===== - Vorremmo che la funzione contasse il numero di stringhe (parametri) da sola; - Vorremmo riuscire a riconcatenare stringhe ottenute con fmlcat ancora una volta con fmlcat.\\