Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取用户输入并以十六进制格式存储_C_Network Programming_Hex - Fatal编程技术网

C 获取用户输入并以十六进制格式存储

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);

我希望用户以以下格式输入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);

使用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,但没有将值存储为整数。谢谢。