2013-06-26 4 views
2

strtol анализирует длинное целое число из заданной строки. Хорошо. Но как я могу проверить, что вообще что-то разбиралось?Как я могу проверить, что strtol разбирал что-нибудь вообще?

Например:

  • с использованием strtol на следующих строк урожайности 0:
    0abcdef
  • однако, используя strtol на следующих строк урожайности 0 тоже:
    abcdef

Так , У меня нет индикатора, будет ли f unction проанализировал действительный 0 или ничего не разобрал и, таким образом, вернулся 0.

Как проверить, работает ли strtol или вернулся с ошибкой? Есть ли альтернативы?

I read that strtol sets an errno на Unix, но меня особенно интересует платформа Win32.

ответ

3

Это подпись strtol():

long int strtol(const char *nptr, char **endptr, int base); 

Если endptr не NULL, strtol() хранит адрес первого недопустимого символа в *endptr. Итак, вы можете просто сравнить *endptr с nptr и, если он отличается, strtol() проанализировал символы до *endptr.

+0

так просто. Благодарю. – eckes

+0

Добро пожаловать @eckes – nouney

+0

Это не обязательно первый недопустимый символ - например, начальная последовательность пробелов действительна, но даже если строка начинается с пробела, если преобразование не выполняется, то гарантируется, что значение 'nptr 'будет храниться в' * endptr'. – caf

1

Использовать второй параметр strtol: это char **. Он будет заполнен первым недопустимым символом: take a look at this manpage.

Пример:

#include <stdlib.h> 
int main() 
{ 
    char  *ptr = 0; 
    const char *str = "1234abcd"; 

    printf("%d\n", strtol(str, &ptr, 10)); // -> 0 
    printf("ptr: %c\n", *ptr); // -> 'a' 
    while (*str && *str != *ptr) 
    { 
     printf("parsed: %c\n", *str); // -> '1' '2' '3' & '4' 
     ++str; 
    } 
    return 0; 
}