Pie*_*ter 9 c base-conversion strtol
我可以做这个:
int main(int argc, char** argv) {
unsigned char cTest = 0xff;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是通过命令行将十六进制数字输入程序的正确方法是什么?
unsigned char cTest = argv[1];
没有办法.这产生了一个初始化,从指针生成整数而没有强制转换警告
Pet*_*Bek 14
我想有些人到这里可能只是在寻找:
$ ./prog `python -c 'print "\x41\x42\x43"'`
$ ./prog `perl -e 'print "\x41\x42\x43"'`
$ ./prog `ruby -e 'print "\x41\x42\x43"'`
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("%ld\n", strtol(argv[1], NULL, 16));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
$ ./hex ff
255
Run Code Online (Sandbox Code Playgroud)
您可以使用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);
Run Code Online (Sandbox Code Playgroud)
正如其他示例中所述,有更短的方法,但它们都不允许您干净地错误检查处理(如果有人通过FFF
而您只需unsiged char
要将其放入,会发生什么?
例如sscanf
:
int val;
sscanf(argv[1], &val)
printf("%d\n", val);
Run Code Online (Sandbox Code Playgroud)