Strtol второй аргумент

Как работает второй аргумент strtol?

Вот что я пробовал:

strtol(str, &ptr, 10)

где ptr — это char *, а str — это строка. Теперь, если я передам str как '34EF' и напечатаю *ptr, это правильно даст мне E, а *(ptr+1) даст мне F, однако, если я напечатаю ptr, это даст мне EF! Не следует печатать ptr, просто приводить к мусорному значению, как шестнадцатеричное значение адрес или как?


person Siddhartha    schedule 23.04.2012    source источник


Ответы (1)


ptr — это указатель на внутреннюю часть строки с завершающим нулем. Итак, учитывая "34EF", он в конечном итоге указывает на символ 'E', а строка, начинающаяся с этого адреса, — "EF".

Четырехсимвольная строка C, такая как p = "34EF", фактически содержит пять строк в одной. Строка p равна "34EF". Строка p+1 равна "4EF"; строка p+2 равна "EF"; p+3 — это "F", а p+4 — это пустая строка "". В этом случае p+4 указывает на нулевой терминаторный байт после F.

Говоря о пустой строке, если входные данные для strtol состоят только из допустимых символов, составляющих числовой токен, то ptr должно указывать на пустую строку.

Если вы хотите запретить конечный мусор, вы можете проверить это. То есть, даже если разбирается действительное число, если *ptr не равно 0, то вход имеет конечный мусор. В некоторых случаях полезно отказаться от этого: «Уважаемый пользователь, 10Zdf — это не число, пожалуйста, введите число!»

person Kaz    schedule 23.04.2012
comment
Нет, это не аналогия. На самом деле там физически пять строк, сжатых в небольшое пространство для хранения из-за общего суффикса. Если бы это была аналогия, я бы включил формулировку, что это аналогия. - person Kaz; 24.02.2021