Преобразовать строку в целое число - каждое представление - PullRequest
1 голос
/ 28 января 2010

Существует ли функция или библиотека, которая может преобразовать любое (по умолчанию, восьмеричное, шестнадцатеричное, ...) целое число в C, заданное как char[] в unsigned long long int?

Примеры:

1
1l
1ul
42e+10
0x2aLL
01234u
...

atoi имеет некоторые проблемы с 0x ... и суффиксами u / l.

Ответы [ 2 ]

4 голосов
/ 28 января 2010

strtoull примерно настолько близко, насколько это возможно. Это остановится на суффиксе, но, поскольку вы всегда создаете unsigned long long, вам все равно действительно не важен суффикс. Я не верю, что он будет работать и с 42e+10 - хотя полученное значение является целым числом, C и C ++ определяют только обозначение 'e' для чисел с плавающей запятой.

Кроме этого, вам нужно / нужно передать 0 в качестве базы преобразования, и в этом случае она реализует обычное соглашение С, согласно которому ведущий 0 сигнал восьмеричный, 0x сигнал шестнадцатеричный и 1-9 сигнал десятичное.

1 голос
/ 30 января 2010

Вы можете использовать sscanf и проверить возвращаемое значение, чтобы увидеть, если он сделал что-то полезное, например ::

bool parseValue (const char *buffer, long &value)
{
if (sscanf(buffer,"%ld",&value)==1) return true;
if (sscanf(buffer,"0x%lx",&value)==1) return true;
...
return false;
}

Вы можете легко добавить больше видов форматов в этот список. Чтобы расширить это и для значений с плавающей запятой, отсканируйте буфер в значение с плавающей запятой, затем приведите или округлите его до целочисленного значения, например:

bool parseValue (const char *buffer, long &value)
{
if (sscanf(buffer,"%ld",&value)==1) return true;
if (sscanf(buffer,"0x%lx",&value)==1) return true;
...
double d;
if (sscanf(buffer,"%lf",&d)==1) {value=d; return true;}
...
return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...