Ciao.
Siccome lo uso da anni Dev-C++ (versione Orwell) e mi trovo bene, mi sento quasi chiamato in causa :)
Ho fatto delle prove con il tuo codice ed in effetti ottengo lo stesso tuo risultato. Quindi ho provato ad eseguire il debug con l'osservazione delle tre variabili a,b e c ed ho notato che ad ogni successiva operazione di scanf le variabili precedenti vengono azzerate. Lo stesso avviene anche con la versione curata da Embarcadero che usa TDM-GCC 9.2.0.
Dichiarando invece le variabili globali, cioè fuori dal main, il programma fornisce l'output corretto.
In rete ho trovato questa discussione:
https://stackoverflow.com/questions/15825254/why-is-scanfhhu-char-overwriting-other-variables-when-they-are-local
che avvalora quanto scritto. Probabilmente è dovuto proprio al TDM-GCC.
Qui viene svelato l'arcano:
"As you note, scanf() is provided by MSVCRT.DLL ... a Microsoft product. You are correct that it isn't C99, (because, in reality, Microsoft have never supported that). Read the MSDN documentation; that's what you must code to. This is a "won't fix", because the reality is that it's a "can't fix" -- the implementation isn't open source, or free software; it's a Microsoft product which we cannot alter, (unless someone has sufficient incentive to provide a complete replacement implementation, and since scanf() is such an appallingly dreadful choice of API anyway, few have)."
In ogni caso, se non esplicitamente richiesto dall'esercizio ha poco senso l'uso dei char al posto degli int per lavorare con numeri piccoli: non siamo negli anni ‘50 o ’60 dove la memoria era dell'ordine delle centinaia di byte.
P.S. con %u funziona, purché lo usi anche nella funzione scanf, che è quella che può dare problemi in Dev-C++
P.P.S. per curiosità, quale università frequenti e quale indirizzo?