我可以这样做:
int main(int argc, char** argv) {
unsigned char cTest = 0xff;
return 0;
}
但是通过命令行将十六进制数输入程序的正确方法是什么?
unsigned char cTest = argv[1];
没有做到这一点。这产生了一个初始化从指针生成整数而没有强制转换警告。
答案 0 :(得分:14)
我认为有些人到这里可能只是在寻找:
$ ./prog `python -c 'print "\x41\x42\x43"'`
$ ./prog `perl -e 'print "\x41\x42\x43"'`
$ ./prog `ruby -e 'print "\x41\x42\x43"'`
答案 1 :(得分:7)
您可以使用strtoul来遍历字符串中的字符并转换它们,同时考虑您传入的基数(在此上下文中为16): -
char *terminatedAt;
if (argc != 2)
return 1;
unsigned long value = strtoul( argv[1], &terminatedAt, 16);
if (*terminatedAt != '\0')
return 2;
if (value > UCHAR_MAX)
return 3;
unsigned char byte = (unsigned char)value;
printf( "value entered was: %d", byte);
正如其他示例中所述,有更短的方法,但它们都不允许您干净地错误检查处理(如果有人通过FFF
会发生什么,而您只有unsiged char
把它放进去?
e.g。与sscanf
:
int val;
sscanf(argv[1], &val)
printf("%d\n", val);
答案 2 :(得分:7)
#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
答案 3 :(得分:4)
unsigned char cTest = argv[1];
错误,因为argv[1]
的类型为char *
。如果argv[1]
包含"0xff"
之类的内容,并且您希望将与其对应的整数值分配给unsigned char
,那么最简单的方法可能是使用strtoul()
来首先转换它到unsigned long
,然后检查转换后的值是否小于或等于UCHAR_MAX
。如果是,您只需分配到cTest
。
strtoul()
的第三个参数是一个基数,它可以是0来表示C风格的数字解析(允许八进制和十六进制文字)。如果您只想允许base 16,请将其作为第三个参数传递给strtoul()
。如果您想允许任何基础(因此您可以解析0xff
,0377
,255
等),请使用0。
UCHAR_MAX
在<limits.h>
中定义。
答案 4 :(得分:1)
在C中执行此类操作的传统方法是使用scanf()。这正是printf()的反转,读取文件(或终端)的给定格式 out 和您列出的变量,而不是将它们写入其中。
在您的情况下,您使用sscanf
,因为您已经在字符串而不是流中使用它。
答案 5 :(得分:-3)
atoi
,atol
,strtoi
,strtol
全部在stdlib.h