posto sia la struttura con cui lavora la mia funzione,sia il codice della funzione stessa.
check201 viene chiamata all'interno di una funzione che subito prima aveva fatto una recv. plen è il numero di byte ricevuti dalla recv appunto.
codice:
struct ResponseGet{
	char buf[MAXLENREQ];
	//int LenRange;
	int expire;
	char dati[MAXLENREQ];
	struct Range range;	
	};

static int check201(struct ResponseGet *pris, int *plen){
	
	printf("\n sono nella check201\n");
	printf("plen vale:%d\n",*plen);
	if(*plen<1) return(0); /* leggere ancora perchè SIMULO ERRORE */
	if(*plen>=1) 
		if(pris->buf[0]!='2') 
			return(-1);
	if(*plen>=2)
		if(pris->buf[1]!='0')
			return(-1);
	if(*plen>=3) 
		if(pris->buf[2]!='1')
			return(-1);
	
	if(*plen>=4)
		if(pris->buf[3]!='\n')
			return(-1);
	if(*plen>=5) 
		if(pris->buf[4]!='R')
			return(-1);
	if(*plen>=6) 
		if(pris->buf[5]!='a')
			return(-1);
	if(*plen>=7)
		if(pris->buf[6]!='n')
			return(-1);
	if(*plen>=8)
		if(pris->buf[7]!='g')
			return(-1);
	if(*plen>=9)
		if(pris->buf[8]!='e')
			return(-1);
	if(*plen>=10)
		if(pris->buf[9]!=' ')
			return(-1);
	
	if(*plen>=11) {
		int ris, len2, len3, len4, valuerange;
		char str[1024];
		
		ris=sscanf(pris->buf+10, "%i", &len2);/*	cerco il valore di inizio del range	*/
		if(ris!=1)	return(-1); /* errato, ci sono caratteri ma non e' numero */
		if( len2<0 ) return(-1); /* errato, len negativo */
		pris->range.first=len2;/*	metto il valore di inizio del range	*/
		valuerange=len2;
		sprintf(str, "%i", len2);
		len2=11+strlen(str);
		if(*plen>=len2){
			if(pris->buf[len2-1]!='-')
				return(-1);
			}
		ris=sscanf(pris->buf+len2+1-1, "%i", &len3);/*	cerco il valore di fine del range	*/
		if(ris!=1)	return(-1); /* errato, ci sono caratteri ma non e' numero */
		if( len3<0 ) return(-1); /* errato, len negativo */
		pris->range.last=len3;/*	metto il valore di fine del range	*/
		
		valuerange=(pris->range.last-pris->range.first)+1;/*	+1 perchè estremi compresi	*/
		sprintf(str, "%i", len3);
		len3=len2+strlen(str)+1;
		printf("valuerange è :%d\n",valuerange);
		printf("il range first è:%d\n",pris->range.first);
		printf("il range last è:%d\n",pris->range.last);
		printf("quel valore è%s\n",pris->buf+len3+1-1);
		if(*plen>=len3){
			if(pris->buf[len3-1]!='\n')
				return(-1);
			}
		
		/* cerco se c'e' Expire xxxx\n  */
		if(*plen>=len3+1)
			if(pris->buf[len3+1-1]!='E')
				return(-1);		
		if(*plen>=len3+2)
			if(pris->buf[len3+2-1]!='x')
				return(-1);		
		if(*plen>=len3+3)
			if(pris->buf[len3+3-1]!='p')
				return(-1);		
		if(*plen>=len3+4)
			if(pris->buf[len3+4-1]!='i')
				return(-1);		
		if(*plen>=len3+5)
			if(pris->buf[len3+5-1]!='r')
				return(-1);		
		if(*plen>=len3+6)
			if(pris->buf[len3+6-1]!='e')
				return(-1);		
		if(*plen>=len3+7)
			if(pris->buf[len3+7-1]!=' ')
				return(-1);
		if(*plen<len3+7+1)
			return(0);
		
		ris=sscanf(pris->buf+len3+7, "%i", &len4);
		if(ris!=1)	return(-1); /* errato, ci sono caratteri ma non e' numero */
		if(len4<0) return(-1); /* errato, len negativo */
		pris->expire=len4;
		
		sprintf(str,"%i", len4);
		/* cerco il carattere successivo alla fine del numero trovato */
		len3= len3 + 8 + strlen(str);
		/* controllo se c'e' l' EOL */
		if(*plen>=len3)
			if(pris->buf[len3-1]!='\n')
				return(-1);	
		/* cerco la fine del messaggio */
		if(*plen>=(len3+1))
			if(pris->buf[len3+1-1]!='\n')
				return(-1);
		
		/*	vedo se il n di bytes ricevuti è minore di quello che mi aspettavo in totale	*/
		if(*plen<(len3+1+valuerange))
			return(0);
		printf("printf di prova\n");
		/* copio nel buffer destinazione i dati allegati nel messaggio 200 */
		
		memcpy(  & (buffer[pris->range.first-1])  , pris->buf+len3+1 , valuerange  );
		
		printf("il buffer riempito è:%s\n",buffer[pris->range.first]);
		
		}
	return(1);	
	
	}
in pratica memcpy si blocca lì, visto che la printf subito prima viene eseguita mentre quella dopo no.