Получение шестнадцатеричного значения из строки «0x4000» (например) и его сохранение в переменной. - PullRequest
0 голосов
/ 29 июля 2011

Вот моя проблема:

Я написал функцию, чтобы определить, является ли строка шестнадцатеричной на основе формата "0x ####":

int lc3_hashex(char *str)
{
    int val = 0;      
    char *to;
    to = strndup(str+2, 10);
    val = sscanf(to, "%x", &val); 
    if (val)
    {
        return val;
    }

    return 0;
}

Предполагая, что параметр имеет форму "0x ####", он возвращает десятичную версию числа записей "0x". Но есть ли какой-либо встроенный способ (или способ, который я просто наблюдаю), чтобы получить целочисленное значение шестнадцатеричного числа "0x4000" вместо целочисленного значения "4000"?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 29 июля 2011

Вы можете уменьшить эту функцию до:

int cnt = sscanf(str, "%x", &val);
if (cnt == 1) {
  // read a valid `0xNNNN` string
}

scanf с форматом %x уже выполняет шестнадцатеричное преобразование и отлично справляется с префиксом 0x. Кроме того, его возвращаемое значение - это количество совпадающих элементов, так что вы можете использовать это, чтобы определить, действительно ли он нашел шестнадцатеричное значение в str или нет.

При этом у вас есть обе части информации, которые вам нужны: была ли строка отформатирована так, как вы ожидали, и какое значение было (правильно преобразовано). Это также позволяет избежать выделения строк (которое вы не освобождаете) и ошибки, которую ваш код имеет, если strlen(str) меньше двух.

Если вы измените свою подпись функции на:

int check_and_get_hex(const char *str, int *val);

(или что-то в этом роде), соответственно обновите вызов sscanf (передавая val вместо &val) и вернув (cnt == 1), вы можете получить как «это правильная шестнадцатеричная строка», так и значение звонящему за один выстрел.

2 голосов
/ 29 июля 2011

Используйте strtol из stdlib.h и укажите основание как 16.

Единственным недостатком является то, что эта функция возвращает 0 при сбое, поэтому вы должны проверить, чтобы убедиться, что ввод для нее не 0.

1 голос
/ 29 июля 2011

Я не понимаю, почему строка обрывается перед выполнением sscanf.Если вы хотите, чтобы строка в шестнадцатеричном значении была преобразована в десятичное целое число, вы можете указать ее напрямую.

#include<stdio.h>
int main()
{
  char sHex[7] = "0x2002";
  int nVal = 0;
  sscanf( sHex, "%x", &nVal );
  printf( "%d", nVal );
  return 0;
}

Это выведет 8194, десятичное значение для 0x2002.Дав "%x" sscanf, вы указываете входную строку как шестнадцатеричное.Итак, предыдущий «0x» в порядке.

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