Получение шестнадцатеричного числа в программе с помощью командной строки

Я могу сделать это:

int main(int argc, char** argv) {
  unsigned char cTest = 0xff;
  return 0;
}

но как правильно получить шестнадцатеричное число в программе через командную строку?

unsigned char cTest = argv[1];

не делает трюк. Это производит инициализации делает целое число от указателя без бросания предупреждение.

6 ответов


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  printf("%ld\n", strtol(argv[1], NULL, 16));

  return 0;
}

пример использования:

$ ./hex ff
255

Я думаю, что некоторые люди, прибывающие сюда, могут просто искать:

$ ./prog `python -c 'print "\x41\x42\x43"'`
$ ./prog `perl -e 'print "\x41\x42\x43"'`
$ ./prog `ruby -e 'print "\x41\x42\x43"'`

вы могли бы использовать strtoul который будет проходить через символы в строке и конвертировать их, принимая во внимание радиус (16 в этом контексте), который вы передаете:-

char *terminatedAt;
if (argc != 2)
    return 1;

unsigned long value = strtoul( argv[1], &terminatedAt, 16);

if (*terminatedAt != '')
    return 2;

if (value > UCHAR_MAX)
    return 3;

unsigned char byte = (unsigned char)value;
printf( "value entered was: %d", byte);

как описано в других примерах, есть более короткие способы, но ни один из них не позволяет вам чисто проверить ошибку обработки (что произойдет, если кто-то пройдет FFF и у вас есть только unsiged char положить его в?

например sscanf:

int val;
sscanf(argv[1], &val)
printf("%d\n", val); 

unsigned char cTest = argv[1];

- это неправильно, потому что argv[1] типа char *. Если argv[1] содержится что-то вроде "0xff" и вы хотите присвоить целочисленное значение, соответствующее этому unsigned char, самый простой способ, вероятно, использовать strtoul() сначала преобразовать его в unsigned long, а затем проверьте, если преобразованное значение меньше или равно UCHAR_MAX. Если да, вы можете просто назначить cTest.

strtoul()третий параметр-это база, которая может быть 0 для обозначения номера C-стиля синтаксический анализ (разрешены восьмеричные и шестнадцатеричные литералы). Если вы хотите разрешить только базу 16, передайте это как третий аргумент strtoul(). Если вы хотите разрешить любую базу (так что вы можете разобрать 0xff, 0377, 255, etc.), используйте значение 0.

UCHAR_MAX определена в <limits.h>.


традиционный способ сделать такую вещь в C - это с scanf (). Это точно обратный printf (), считывающий данный формат из файла (или терминала) и в переменные, которые вы перечисляете, а не записывать их в него.

в вашем случае, вы могли бы использовать sscanf поскольку вы уже получили его в строке, а не в потоке.


atoi, atol, strtoi, strtol

все stdlib.h