Как остановить пользователя, вводя char в качестве int-входа в C

Вот часть моего кода:

printf("\nEnter amount of adult tickets:"); scanf("%d", &TktAdult); while (TktAdult<0){ printf("\nPlease enter a positive number!"); printf("\nEnter amount of adult tickets:"); scanf("%d", &TktAdult); } 

Прямо сейчас он может только остановить пользователя от ввода отрицательного значения, но как мне добавить его, чтобы он также не позволял пользователю вводить символ?

    Следующий код отклоняет ввод пользователя, который:

    • не-числовой, обрабатываемый // 1;
    • отрицательные числа, обрабатываемые // 2;
    • положительные числа, за которыми следуют нечисловые символы, обрабатываемые // 3

       while (1) { printf("\nEnter amount of adult tickets: "); if (scanf("%d", &TktAdult) < 0 || // 1 TktAdult < 0 || // 2 ((next = getchar()) != EOF && next != '\n')) { // 3 clearerr(stdin); do next = getchar(); while (next != EOF && next != '\n'); // 4 clearerr(stdin); printf("\nPlease enter a positive number!"); } else { break; } } 

    Кроме того, // 4 очищает стандартный ввод буферизованных нечисловых символов, следующих за случаем // 3 (т.е. 123sda - scanf принимает 123, но оставляет «sda» в буфере).

    … остановить пользователя от ввода отрицательного значения …

    это невозможно. Пользователи вводят всевозможные тарабарщины. Вместо этого прочитайте строку ввода пользователя и проанализируйте ее для правильности. Используйте fgets() для ввода, затем sscanf() , strtol() и т. Д. Для синтаксического анализа.

     // return -1 on EOF int GetPositiveNumber(const char *prompt, const char *reprompt) { char buf[100]; fputs(prompt, stdout); fflush(stdout); while (fgets(buf, sizeof buf, stdin)) [ int value; if (sscanf(buf, "%d", &value) == 1 && value > 0) { return value; } fputs(reprompt, stdout); fflush(stdout); } return -1; } // Usage int TktAdult = GetPositiveNumber( "\nEnter amount of adult tickets:" , "\nPlease enter a positive number!"); if (TktAdult < 0) Handle_End_of_File(); else Success(TktAdult); 

    но как мне добавить к нему, чтобы он также не позволял пользователю вводить символ?

    Вы не можете запретить пользователю вводить значения символов. Вы можете проверить, успешно ли проверен tktAdult . Если нет, очистите все от stdin:

      bool valid = false; while (true) { ... if (scanf("%d", &TktAdult) != 1) { int c; while ((c = getchar()) != EOF && c != '\n'); } else { break; } } 

    Лучшая альтернатива – использовать fgets() а затем проанализировать строку с помощью sscanf() .

    Также см .: Почему все говорят, что не использовать scanf? Что я должен использовать вместо этого? ,

     // You can try this, Filter all except for the digital characters int TktAdult; char ch; char str[10]; int i = 0; printf("\nEnter amount of adult tickets:"); while ((ch = getchar()) != '\n') { // Filter all except for the digital characters if(!isalpha(ch) && isalnum(ch)) str[i++] = ch; } str[i] = '\0'; TktAdult = atoi(str); printf("Done [%d]\n", TktAdult);