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++; }