Well if you ALWAYS use fgets with a large buffer, then the whole "fflush" thing goes away, unless you user is being a complete idiot. Even then, no actual harm will come to your program.

Eg.
char buff[BUFSIZ];

Then scanf("%d",&number);
would be
fgets( buff, sizeof buff, stdin );
sscanf( buff, "%d", &number );

1. Both fgets and sscanf return a result, use them.
2. strtol() is a better function than sscanf at converting strings to ints

Also, fgets(s[i].name, sizeof(s[i].name), stdin);
would be
fgets( buff, sizeof buff, stdin );
Then either strncpy, or sscanf (with a width modifier)
Ideally, your own strncpy implementation which always appends a \0.

By the time you're into really validating your data, the difference between always using fgets(), and using scanf + random hacks to fix the input stream, you've got pretty much the same amount of code.

The only difference being, using fgets() to a buffer, then parsing and validating that buffer is a consistent approach which works.

This is a cruel test
myprog.exe < myprog.exe
If your program crashes, then it doesn't handle input well at all.