Проблема, которую вы видите, в том, что она действительно читает персонажа, но это не тот персонаж, которого вы ожидаете. scanf делает форматированный ввод. Когда вы звоните в первый раз, вы говорите, что ожидаете число. Но вы действительно вводите больше, чем просто число:
Number?
1234.5678<enter>
Когда вы нажимаете клавишу ввода, он фактически вставляет символ в ваш поток ввода. Как вы, возможно, знаете, мы используем \ n для представления новой строки, символа, который вы получаете, когда нажимаете ввод. Таким образом, ваш входной поток на самом деле выглядит как "1234.5678 \ n".
Так что scanf делает свое дело и читает 1234.5678, а затем видит '\ n'. Там написано «о, это не часть номера, поэтому я остановлюсь». Что ж, ваш ввод по-прежнему содержит '\ n'. В следующий раз, когда вы вызовете scanf, вы скажете ему прочитать символ. Пользователь вводит все, что хочет, но это идет после '\ n' из предыдущего сканирования. Поэтому scanf пытается сопоставить входной поток с символом и говорит: «Хорошо, первое, что есть в этом входном потоке, это символ, и это '\ n', поэтому я его верну». Материал, введенный пользователем, все еще находится в потоке ввода.
Таким образом, простой способ избавиться от него - создать цикл, который очищает все оставшиеся символы из входного потока до тех пор, пока не найдет \ n.
printf("Number?\n");
scanf("%f", &number1);
while( getchar() != '\n');
После выполнения этого цикла ваш входной поток будет пустым. Поэтому в следующий раз, когда вы вызовете scanf, он будет ждать, пока пользователь что-то наберет, и будет использовать все, что набрал пользователь.
Также обратите внимание, что scanf имеет возвращаемое значение, которое вы должны проверить после его вызова. Читайте о scanf, чтобы увидеть, что он возвращает.