зацени тип возвращаемого значения
Вот где собака-то зарыта! Раз возвращает int, то в 1) %c преобразовывает в букву, в 3) наверное, put
char, в 4) переменная
c объявлена как char, поэтому тоже срабатывает. А в 2) ничего нет, вот и выводит int.
Давно проги на С++ не писал, но насколько помню
toupper переводит строку в верхний регистр всю.
Из документации
int toupper ( int c );
Значит не всю, а только по одному символу.