====== 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.\\