Per ora non ho controllato se il programma fa quello che ti serve, ma entra in loop perchè in pratica il for esterno è inutile, in quanto quello conta è il while interno, che continua all'infinito non essendoci un incremento della i, ti conviene eliminare il for e fare una cosa del genere:

codice:
i = 0;

while(testo[i]!='\0')
{
        if(testo[i]!=' '|| testo[i]!='\n'||  testo[i]!='\t')
                 n_caratteri++;
        else
                 n_parole++;
        if(n_caratteri==3 && testo[i+1]==' ' || testo[i+1]=='\n' || testo[i+1]=='\t')
        {
                 contatore=contatore+1;
                 n_caratteri=0;
        }
  
        i++;
}