Indice

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 <stdarg.h>
#include <string.h>
#include <ctype.h>
 
 
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

  1. Vorremmo che la funzione contasse il numero di stringhe (parametri) da sola;
  2. Vorremmo riuscire a riconcatenare stringhe ottenute con fmlcat ancora una volta con fmlcat.