Один из вариантов - использовать спецификатор %n
для записи количества символов, обработанных при сканировании. Строка формата " %n%d%n"
пропустит любой начальный пробел, запишет количество символов, обработанных до этой точки, отсканирует int и снова запишет количество обработанных символов.
scanf
для одного элемента может возвращать 1 (успех), 0 (невозможно проанализировать значение) или EOF (конец файла). Если возвращаемое значение равно 0, ввод должен быть очищен от ожидающих символов.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int id, workedHours;
int first = 0;
int last = 0;
int result = 0;
float payHour, payMonth;
do
{
printf("Please enter your ID: ");
fflush ( stdout);
result = scanf ( " %n%d%n", &first, &id, &last);
if ( result == EOF)
{
return 0;
}
if ( result == 0)
{
while ( getchar ( ) != '\n')
{
//clean input
}
}
}
while ( result != 1 || last - first != 4);
do
{
printf("Please enter your worked hours: ");
fflush ( stdout);
result = scanf("%d", &workedHours);
if ( result == EOF)
{
return 0;
}
if ( result == 0)
{
while ( getchar ( ) != '\n')
{
//clean input
}
}
}
while ( result != 1);
do
{
printf("Please enter the amount you received per hour: $");
fflush ( stdout);
result = scanf("%f", &payHour);
if ( result == EOF)
{
return 0;
}
if ( result == 0)
{
while ( getchar ( ) != '\n')
{
//clean input
}
}
}
while ( result != 1);
payMonth = payHour * workedHours;
printf("ID: %04d\n", id);
printf("Salary: $%.2f\n", payMonth);
return(0);
}