C 获取用户输入并以十六进制格式存储
我希望用户以以下格式输入MAC地址:C 获取用户输入并以十六进制格式存储,c,network-programming,hex,C,Network Programming,Hex,我希望用户以以下格式输入MAC地址:aa:bb:cc:dd:ee:ff,然后在我的代码中将其作为argv[1] 现在我如何将其存储在十六进制格式的数组中 我需要的是数组如下所示: char temp[6] = { 0xaa,0xbb,0xcc,0xdd,0xee,0xff } 有什么想法吗 int a, b, c, d, e, f; sscanf(argv[1], "%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
aa:bb:cc:dd:ee:ff
,然后在我的代码中将其作为argv[1]
现在我如何将其存储在十六进制格式的数组中
我需要的是数组如下所示:
char temp[6] = { 0xaa,0xbb,0xcc,0xdd,0xee,0xff }
有什么想法吗
int a, b, c, d, e, f;
sscanf(argv[1], "%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
使用INT获取值,然后您可以将它们放在char数组中,因为它们有字节值。数组不是以十六进制格式存储的;十六进制格式仅适用于读取和打印。在内部,所有数字都以二进制形式存储
sscanf(str, "%x:%x:%x:%x:%x:%x", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5]);
要读取十六进制数字,可以使用;要打印十六进制数字,可以使用printf
。要让scanf
知道您希望它读取十六进制数字,请使用格式说明符%x
。如果要读入char
而不是int,请使用修饰符
hh`。下面是一个您如何将其用于您的案例的示例:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
unsigned char addr[6];
char dummy;
if (argc != 2) {
fprintf(stderr, "Wrong number of arguments\nUsage: %s ADDRESS\n",
argv[0]);
exit(1);
}
int res = sscanf(argv[1], "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx%c",
&addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5],
&dummy);
if (res == EOF) {
fprintf(stderr, "Reached end of input without matching\n");
exit(1);
} else if (res < 6) {
fprintf(stderr, "Got fewer hex digits than expected\n");
exit(1);
} else if (res > 6) {
fprintf(stderr, "Got extra characters after input\n");
exit(1);
}
printf("Got: %02hhx, %02hhx, %02hhx, %02hhx, %02hhx, %02hhx\n",
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
return 0;
}
#包括
#包括
int main(int argc,字符**argv){
无符号字符地址[6];
模拟字符;
如果(argc!=2){
fprintf(stderr,“参数数目错误\n用法:%s地址\n”,
argv[0]);
出口(1);
}
int res=sscanf(argv[1],%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx%c),
&地址[0]、&addr[1]、&addr[2]、&addr[3]、&addr[4]、&addr[5],
&假人);
如果(res==EOF){
fprintf(stderr,“到达输入端但不匹配\n”);
出口(1);
}否则如果(res<6){
fprintf(stderr,“得到的十六进制数字比预期的少\n”);
出口(1);
}否则,如果(分辨率>6){
fprintf(stderr,“输入后获得额外字符\n”);
出口(1);
}
printf(“获取:%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhhx\n”,
地址[0]、地址[1]、地址[2]、地址[3]、地址[4]、地址[5]);
返回0;
}
请注意,我在输入后读入了一个伪字符,以检查输入末尾是否包含垃圾。这对于您的用例来说可能是必要的,也可能不是必要的。您是否阅读了有关例如
sscanf
的文档?您可以使用sscanf来执行此操作。这可能会导致内存溢出,因为%x需要一个整数。在这种情况下,temp必须是一个有效的int向量。我以前使用过sscanf,但没有将值存储为整数。谢谢。