בפלטפורמות מסויימות ה-Buffer (של ה-STDIN או ה-STDOUT) מתמלא ולא פולט מיד את המידע החוצה. אתה רגיל בעיקר לעבוד מול מסך מחשב, בעוד שבעולם האמיתי המון פעמים אתה עובד בלי מסך בכלל, לכן יש הגיון של אופטמיזציות מסויימות לפעמים לאגור מעט את ה-BUFFER. ספציפית לגבי stdin לא עולה לי סיבה טובה למה זה ככה, אבל מניח שיש כזאת. אפשר לחשוב על דוגמא מעניינת יותר - אם כבר נפתח הדיון - שאתה כותב תכנית כמו:
{
printf("Hello World\n");
fork();
printf("\n");
}
בגרסאות מסויימות אם תריץ את זה, יודפס Hello World פעמיים וזה כי printf מעתיקה לפעמים לבאפר, עדיין לא מדפיסה. fork() משכפל את הבאפר ולכן יודפס פעמיים. יש בזה הגיון לאגור את כל המידע ורק אז לשחרר אותו.
(fflush אחרי ה-printf של Hello World היה פותר את הבעייה)
כמו שהמרצה שלך אמר, הפתרון הוא לנקות את הבאפרים בעזרת fflush(stdout) או fflush(stdin) בהתאם למה שאתה צריך לעשות.
באופן כללי אני נגד לקלוט המון דברים בעזרת scanf. מומלץ לקלוט דברים דרך ה-args, במידה ויש ריבוי קלטים עדיף להשתמש ב-vscanf, משתמשים גלובלים הם גם אפשרות.