codice:
char *ins_stringa(char *originale, const char *da_inserire, int posizione) {
  int lo=strlen(originale);
  int la=strlen(da_inserire);
  // se la posizione è inferiore a zero, verrà contata come 0
  // se la posizione è superiore alla lunghezza dell'orig., verrà contata come ultima.
  if (posizione < 0) posizione=0;
  else if (posizione > lo) posizione=lo;
  // alloca la stringa temporanea
  char *temp;
  if (posizione!=lo) {
    int tocp= lo-posizione;
	int count=0;
	temp= (char *) malloc(sizeof(char)*tocp);
    do
	  temp[count++]=originale[count+lo-tocp];
	 while (count<lo);
    }
  originale= (char *) realloc(originale,sizeof(char)*(lo+la+1));
  int count=posizione;
  while (count-posizione<la) { // copia la stringa da inserire
    originale[count++]=da_inserire[count-posizione];
	}
  while (count<lo+la) {
    originale[count++]=temp[count-la-posizione];
	}
  originale[lo+la]='\0';
  return originale;
  }
funziona, è la prima cosa che mi è venuta in mente.
se hai bisogno di chiarimenti chiedi pure.