Как сделать проверку, что я ввел не строку, а число в Си?

Как сделать проверку, что я ввел не строку, а число? Язык Си. Попытался сделать так, но происходит ошибка, из-за пересечение fgets и sscanf (наверное)

enum type {isInt, isChar, isString};

struct Element{
    union {
        int ival;
        float fval;
        char cval;
        char word[10];      // Пусть максимальная длина слова будет 10
    };
    struct Element *previous;

};

struct Element *set(){
        struct Element *el;
        int chs;
        printf("Which type:\n1-int\n2-string\n3-char\n");
        scanf("%d", &chs);
        switch(chs){
        case 1:{
            char num_str[256];
            int num;
            printf("enter value: ");
            fgets(num_str, sizeof(num_str), stdin);
            while(sscanf(num_str, "%d", &num)!=1){
                printf("Input error: ");
                fgets(num_str, sizeof(num_str), stdin);
            }
            el->ival = num;
        }
        }

        return el;
    };

Ответы (1 шт):

Автор решения: Sergey

Стандартный путь - воспользоваться свойством функции scanf() возвращать код ошибки:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

        При успешном выполнении данные функции возвращают 
количество входных совпавших и назначенных  элементов, которое  может  быть
меньше, чем предусматривалось, или даже равно нулю, в случае
преждевременной ошибки при поиске совпадений.
 
Если конец входных данных был достигнут раньше, чем произошло хотя 
бы одно  совпадение  или  при  ошибке совпадения  возвращается 
значение EOF. Значение EOF также возвращается при ошибке чтения; в
этом случае для потока устанавливается индикатор ошибки (смотрите
ferror(3)), а в errno указывается номер ошибки.

Проще говоря, сделайте так:

rc = scanf("%d", &num);
if (rc !=1 ) { /* Обработка ошибки */
→ Ссылка