Что делает 2-й аргумент в функции strtoul ()? - PullRequest
0 голосов
/ 08 апреля 2019

Согласно этому документу ,

Второй аргумент (char ** endptr) кажется пустой тратой пространства! Если он установлен в NULL, STRTOL, кажется, работает вниз по строке, пока он находит недопустимый символ и затем останавливается. Все действительные символы прочитаны затем преобразуется, если строка начинается с недопустимого символа функция возвращает НОЛЬ (0).

Это означает, что следующий код должен определить 2 как шестнадцатеричное число:

int main()
{
    char * string = "p1pp2ppp";

    unsigned integer = strtoul(string, NULL, 16);

    printf("%u", integer);

    return 0;
}

но возвращается ноль.

Почему?

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Страница man говорит о втором аргументе следующее:

Если endptr не равен NULL, strtol () сохраняет адрес первого недопустимый символ в * endptr. Если бы не было цифр вообще, strtol () сохраняет исходное значение nptr в * endptr (и возвращает 0). В частности, если * nptr не '\ 0', а ** endptr '\ 0' при возврате, вся строка действительна.

Например:

char str[] = "123xyz45";
char *p;
long x = strtol(str, &p, 10);
printf("x=%ld\n", x);
printf("p - str = %d\n", p - str);
printf("*p = %c\n", *p);
printf("p (as string) = %s\n", p);

Выход:

x=123
p - str = 3
*p = x
p (as string) = xyz45

Мы можем видеть, что когда strtol возвращает p, указывает на первый символ в str, который не может быть преобразован. Это может быть использовано для последовательного разбора строки или для просмотра, можно ли преобразовать всю строку или есть ли дополнительные символы.

В нашем примере первый символ в string, а именно «p», не является десятичной цифрой, поэтому ничего не преобразуется и функция возвращает 0.

0 голосов
/ 08 апреля 2019

Аргумент char **endptr во всех функциях strto* предназначен для получения адреса первого символа, который не является частью действительного целого числа (десятичное, шестнадцатеричное или восьмеричное) или плавающегономер точки.Далеко не бесполезный, он удобен для проверки неверного ввода.Например, если я хотел набрать 1234, но что-то вроде жирного пальца типа 12w4, strtoul вернет 12 и установит для аргумента endptr значение w.

Как правило, если символ endptr указывает не на пробел или 0, то ввод, скорее всего, будет отклонен.

0 голосов
/ 08 апреля 2019

Почему?

Возвращается 0, потому что "p..." не следует никаким правилам целочисленного представления. 2-й аргумент не относится к вашему вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...