strtol
преобразует значение в long int
, диапазон которого может отличаться от int
. Кроме того, он возвращает LONG_MAX
или LONG_MIN
, если значение может быть преобразовано, но находится за пределами диапазона для long int
. В этом случае для errno
будет установлено значение ERANGE
(но не иначе!) Кроме того, в случае сбоя сопоставления возвращаемое значение равно 0, но errno
не установлено; но ep
указывает на начало строки.
int isInt (char *s)
{
char *ep = NULL;
// zero errno first!
errno = 0;
long i = strtol (s, &ep, 10);
if (errno) {
return 0;
}
// matching failure.
if (ep == s) {
return 0;
}
// garbage follows
if (! ((*ep == 0) || (!strcmp(ep,"\n")))) {
return 0;
}
// it is outside the range of `int`
if (i < INT_MIN || i > INT_MAX) {
return 0;
}
return 1;
}
То, что dbush говорит об использовании perror
, верно. strtol
устанавливает ошибку только в случае переполнения long
, что не является единственно возможным случаем сбоя в вашей функции, поэтому perror
может напечатать что-нибудь вроде Is a directory
или Multihop attempted
.
общественность освобождает afterTextChanged (Доступный для редактирования s)
, Этот метод называют, чтобы уведомить Вас, что, где-нибудь в
s
, текст был изменен. Законно внести дальнейшие изменения вs
от этого обратного вызова, но бояться вовлекать себя в бесконечный цикл, потому что любые изменения Вы составляете завещание, заставляют этот метод быть названным снова рекурсивно. (Вам не говорят, где изменение произошло, потому что другой afterTextChanged () методы, возможно, уже внес другие изменения и делал недействительным смещения. Но если необходимо знать здесь, можно использоватьsetSpan(Object, int, int, int)
вonTextChanged(CharSequence, int, int, int)
, чтобы отметить место и затем искать отсюда, где промежуток закончился.
общественность освобождает beforeTextChanged (CharSequence s, международный запуск, международное количество, интервал после)
, Этот метод называют, чтобы уведомить Вас, что, в
s
, этиcount
символы, начинающиеся вstart
, собираются быть замененными новым текстом с длинойafter
. Это - ошибка попытаться внести изменения вs
от этого обратного вызова.
общественность освобождает onTextChanged (CharSequence s, международный запуск, интервал прежде, международное количество)
, Этот метод называют, чтобы уведомить Вас, что, в
s
, этиcount
символы, начинающиеся в [1 111], только что заменили старый текст, который имел длинуbefore
. Это - ошибка попытаться внести изменения в [1 113] от этого обратного вызова.
прямо от [1 114] Ссылка Android для TextWatcher.