Direi che questo:
codice:
scanf("%s", &dare[i]);
è un ottimo modo per ottenere dei crash.
dare è una std::string che non ha niente a che fare con i char*.
Meglio se usi cin e cout per input e output.

In più questa riga ( e il relativo while) :
codice:
if(valoreDARE[i] != valoreAVERE[i])
effettua un confronto tra float che notoriamente è fonte di grattacapi a causa dell'approssimazione della macchina.