strtol дает один и тот же ответ для двух разных шестнадцатеричных строк

Итак, у меня есть две шестнадцатеричные строки — "3b101c091d53320c000910" и "071d154502010a04000419". Когда я использую для них strtol(), я получаю одинаковое значение для обеих строк.

Я пробовал следующий код-

    string t1="3b101c091d53320c000910";
    long int hext1=strtol(t1.c_str(),0,16);
    string t2="071d154502010a04000419";
    long int hext2=strtol(t2.c_str(),0,16);
    cout<<hext1<<endl;
    cout<<hext2<<endl;

Оба дают мне одинаковое значение: 9223372036854775807.

Я не знаю, как именно работает strtol(), так как я новичок в C++, но он дает мне одно и то же значение для двух разных шестнадцатеричных строк. Почему?


person Karlee    schedule 22.09.2014    source источник
comment
Значение этих строк слишком велико, чтобы поместиться в длинное целое число. Значение, которое вы получаете в результате: 9223372036854775807, является наибольшим положительным значением, которое может поместиться в переменной типа long int.   -  person Stephen Doyle    schedule 22.09.2014


Ответы (2)


Вы должны начать с чтения справочной страницы. Он возвращает LONG_MAX, так как введенные вами данные слишком велики, чтобы поместиться в long.

Кроме того, strtol() — это очень C-способ ведения дел, а вы программируете на C++.

person unwind    schedule 22.09.2014
comment
С другой стороны, создание std::istringstream и проверка того, что все использовано, — довольно сложное решение. Я согласен с тем, что это, вероятно, тот, который следует изучать в первую очередь, или, по крайней мере, тот, который должен использоваться новичком, но std::strtol — это вполне допустимый C++. - person James Kanze; 22.09.2014

Вы неправильно используете strtol. Вы должны установить errno в 0 перед его вызовом и убедиться, что он по-прежнему равен 0; в противном случае он будет содержать код ошибки (который можно отобразить с помощью strerror). Кроме того, вы должны передать ему адрес char const*, чтобы вы могли убедиться, что он обработал всю строку (в противном случае "abc" вернет 0 без ошибки):

errno = 0;
char const* end;
long hext1 = strtol( t1.c_str(), &end, 16 );
if ( errno != 0 || *end != '\0' ) {
    //  Error occured.
}
person James Kanze    schedule 22.09.2014