Soluzione a)
codice:
do
        {
            printf("\nr (unsigned int) vale: ");
            scanf("%u",&r);

            fflush(stdin);
 
            printf("\nVuoi ripetere? S/N\n ");
            scanf("%c",&m);
        }

    while(m!='N' && m !='n');
oppure

Soluzione b)
codice:
do
        {
            printf("\nr (unsigned int) vale: ");
            scanf("%u",&r);

            getchar();
 
            printf("\nVuoi ripetere? S/N\n ");
            scanf("%c",&m);
        }

    while(m!='N' && m !='n');
scanf non scarta il '\n' che immetti nel buffer di input quando hai inserito il numero, per cui "scanf("%c",&m)" piazzerà in m il carattere '\n'.
La prima soluzione "flusha" (scarica) il buffer di input che è rimasto dopo che scanf ne ha prelevato il numero,

esempio1 ('\n' indica che premi invio, '\t' è il tab) :
tu scrivi "12431 \t \n" questo va nel buffer di input
scanf prende 12431
ora il buffer contiene questa schifezza " \t \n"
fflush() la butta via.

esempio2
se scrivi "12431\n"
allora scanf preleva 12431
il buffer di input contiene "\n"
Soluzione: a) fflush() lo butta via.
b) getchar() che lo scarta.

La gestione dell'input in maniera robusta richiede di costruirsi
una piccola libreria con funzioni tipo
get_int(int* i, int maxlen)
che gestiscono anche il massimo numero di caratteri di cui un
numero può essere composto.

codice:
printf("dammi i:";
scanf("%3d",&i);
dammi i: 12000
codice:
printf("i = %d", i);
i = 120

quello che si vuole è che l'utente non inserisca più di 3 caratteri, non basta dire non inserire più di 3 caratteri, occorrono funzioni ad hoc, stesso discorso per i float e per le stringhe.