@Hazelberg: getchar-satsen är till för att rensa buffern i förberedelse för nästa inmatning, inte för att läsa in indata.
Men jo, att läsa in indata kan vara rätt besvärligt i C om man vill få till det ordentligt. En lösning skulle vara att skippa scanf och bara använda getchar för att läsa in ett tecken i taget, och så ha ett case i switch-satsen som ignorerar '\n'-tecken.
Man kan också läsa in en hel rad till en buffer och utföra operationer på buffern istället för direkt på stdin, och sen bara slänga buffern när man är klar med den. För att läsa in en hel rad kan du använda getline, men då måste man hålla koll på minnet som används. Med getline kan man antingen allokera en buffer själv, eller låta getline göra det åt en. Oavsett så bör man frigöra minnet när man är klar med buffern, annars får man en minnesläcka. Så t.ex.:
// Om man vill att getline ska allokera minne åt en så ska buffer vara NULL och n vara 0.
char *buffer = NULL;
size_t n = 0;
int c;
while (...) {
// Läs in en rad från stdin.
getline(&buffer, &n, stdin);
// Försök läsa in en siffra från buffern, och skriv ut felmeddelande om det inte gick.
// sscanf returnerar antalet element som kunde läsas in, och vi frågar efter 1 element här.
if (sscanf(buffer, "%d", &c) != 1) {
printf("Kunde inte läsa in nummer\n");
}
}
free(buffer); // Frigör buffern.
Jag lade in while-loopen i exemplet för att visa att du kan återanvända buffern, och frigöra den efter loopen. Frigör du den i loopen så kommer det fortfarande fungera, men getline kommer allokera nytt minne varje gång. getline använder realloc för att utöka buffern om det behövs, så man behöver inte bry sig om storleken på den.