*Pointer_variable ! = '\0' не работает для проверки неудачного преобразования в функции strtol()
Программа не работала для ввода данных 5р то есть при вводе, когда первый символ-это число, а оставшийся следующий символ-любой алфавит или отрицательное число. Например, когда я даю ввод как 5р на выходе я получаю факториал 5.
Поэтому я попробовал поставить чек на strtol неудачное преобразование :-
if (p == buf || *p != '\0'){ printf("\nInvalid input: not a number\n");}
но я получаю вывод как недопустимый ввод: не число для всех входных данных.
Я нашел много подобных вопросов в google. Однако они не решают мою проблему. Я не понимаю, что плохого в этой простой проверке? Как я могу успешно обнаружить ошибки из strtol?
Что я уже пробовал:
#include <stdio.h> #include <limits.h> #include <stdlib.h> #include <errno.h> int display(); void fact_fun(int num_fact); int main() { int num; while ((num = display()) >= 0) { fact_fun(num); } return 0; } int display() { char buf[256]; char *p; long value; for (;;) { printf("Enter number to find factorial or press ENTER KEY to exit: "); if (fgets(buf, sizeof buf, stdin) == NULL || *buf == '\n') return -1; errno = 0; value = strtol(buf, &p, 0); if (p == buf || *p != '\0') { printf("Invalid input: not a number\n"); } else { if (value < 0) { printf("Invalid input: negative values not allowed\n"); } else if (errno != 0 || value > INT_MAX) { printf("Invalid input: value too large for type int\n"); } else { return (int)value; } } } } void fact_fun(int num_fact) { int fact = 1; for (int i = 1; i <= num_fact; i++) { if (fact > INT_MAX / i) { printf("Invalid input: arithmetic overflow\n"); return; } fact = fact * i; } printf("Factorial of %d is %d\n", num_fact, fact); }