>>321 (2) 問題が曖昧。配列S1の書き換えを行うヴァージョン。
#include <stdio.h>
#include <string.h>
#define LEN 100
void concat(char *s1, char *s2, char *s3, int n) {
  strcpy(s3, s1); s1[n] = '\0';
  strcat(s1, s2);
  strcat(s1, &s3[n]);
}
int main(void) {
  char S1[LEN+1], S2[LEN+1], work[LEN+1];
  int n, len;

  printf("S1="); fgets(S1, LEN+1, stdin); len = strlen(S1)-1; S1[len] = '\0';
  printf("S2="); fgets(S2, LEN+1, stdin); S2[strlen(S2)-1] = '\0';
  printf("n="); scanf("%d", &n);
  if(len < n) n = len;
  concat(S1, S2, work, n);
  puts(S1);
  return 0;
}