Może będę się podpalany na nie za pomocą strtol
lub podobnych libc
funkcje, ale rozumowanie o ten problem nie jest trudne:
#include <stdbool.h> // if using C99... for C++ leave this out.
#include <ctype.h>
bool is_valid_int(const char *str)
{
// Handle negative numbers.
//
if (*str == '-')
++str;
// Handle empty string or just "-".
//
if (!*str)
return false;
// Check for non-digit chars in the rest of the stirng.
//
while (*str)
{
if (!isdigit(*str))
return false;
else
++str;
}
return true;
}
[NB: mógłbym inaczej zrobione isdigit(*str++)
zamiast else
do ale krótsze, ale moje wspomnienie jest takie, że standardy mówią, że możliwe jest, że isdigit
jest makro.]
Domyślam się, że jednym ograniczeniem jest to, że nie zwraca ono fałszu, jeśli liczba w łańcuchu nie mieści się w liczbie całkowitej. To może lub nie ma znaczenia dla Ciebie.
'atoi' nie sprawdza błędów; jego zachowanie, jeśli 'str' nie zawiera reprezentacji wartości' int', jest niezdefiniowane. (Typowe implementacje zwracają '0'.)' Sscanf' jest lepszy, ale jego zachowanie jest niezdefiniowane, jeśli wartość w łańcuchu nie jest reprezentowana jako 'int'. Twój tytuł mówi, że chcesz sprawdzić poprawną int, ale treść twojego pytania mówi "poprawna liczba całkowita"; nie są tym samym. 'int' jest jednym z kilku typów * liczb całkowitych *. –