if ((n>4)&&(n<2))
{
printf("Al massimo 4 e minimo 2 giocatori\n");
InsGiocatori();
}
Ehm...io direi che quella chiamata ricorsiva è altamente fuori luogo, prima di tutto (parlo della chiamata a InsGiocatori())! Usa un ciclo infinito! Inoltre, in quello stesso if non ci va && ma ||. Scritto così quell'if è superfluo, perché sarà SEMPRE falso! Pensaci: un numero può essere CONTEMPORANEAMENTE (&&, and logico) minore di 2 e maggiore di 4?

Guarda:

codice:
char InsGiocatori()
{
    int cont, n;

    while( 1 ) // ciclo infinito
    {
        printf( "In quanti volete giocare? " );
        scanf( "%d", &n );

        if( ( n < 2 ) || ( n > 4 ) )
        {
            printf( "Al massimo 4 e minimo 2 giocatori\n" );
            continue; // ripete la richiesta
        }

        for( cont = 0; cont < n; cont++ )
        { 
            printf( "Inserire il nome del giocatore: " );
            gets( v[ cont ].nome );
        }

        break;
    }
}
In alternativa puoi usare anche un goto evitando il ciclo.

Ciao.