Получение шестнадцатеричного числа в программе с помощью командной строки
Я могу сделать это:
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
поскольку вы уже получили его в строке, а не в потоке.