int strcmp(char *, char *);

strcmp() confronta le due stringhe e ritorna un intero >, < 0 = a zero a seconda se la prima stringa è <, > o = alla seconda.
Qui si sfrutta il fatto che per il C un intero = 0 rappresenta il falso (per il C++ esiste invece il tipo bool).
Quindi strcmp(risposta, "NO") è equivalente a strcmp(risposta, "NO") != 0 .
Col C puoi scrivere codice molto efficiente e pulito a volte a discapito della chiarazze (per i non adetti al lavoro).
Effettivamnete il C++ dispone di un tipo sring, e quindi è meglio in questo caso usarlo, ma ho utilizzato il vettore di caratteri per darti le due alternative (C e C++).
Nella chiamata a strcmp il primo argomento è il vettore di caratteri, quando ad una funzione che accetta un puntatore a char viene passato il nome del vettore qusto viene automaticamente convertito nel puntatore al primo carattere del vettore.
Un'ultima cosa il preferirei il ciclo do .... while risposta ... ad un salto condizionato. I salti condizionati si utilizzano solo quando hai più cicli annidati uno dentro l'altro.
Per il discorso dell'errore che riscontri nella lettura della stringa è necessario, come ti ha detto pallinipinco, che posti un po' di codice.
ciao
sergio