2012-03-28 72 views
-1

我希望用户在格式输入MAC地址:aa:bb:cc:dd:ee:ff,然后我把这个在我的代码argv[1]例如。获取用户输入并将其存储在十六进制

现在我该如何将它存储在十六进制格式的数组中?

我需要的是该数组看起来像这样:

char temp[6] = { 0xaa,0xbb,0xcc,0xdd,0xee,0xff } 

任何想法?

+0

您是否阅读过文档'sscanf'? – 2012-03-28 21:37:31

+0

你可以使用sscanf来做到这一点。 – rbelli 2012-03-28 21:38:49

回答

0
int a, b, c, d, e, f; 

sscanf(argv[1], "%x:%x:%x:%x", &a, &b, &c, &d, &e, &f); 

使用INT得到的值,那么你可以将它们放在字符数组,因为他们有一个字节的值。

+0

工作。我之前使用sscanf,但没有将值存储为整数。非常感谢。 – cocoacoder 2012-03-28 22:03:17

0
sscanf(str, "%x:%x:%x:%x:%x:%x", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5]); 
+0

这可能会溢出内存,因为%x需要一个整数。 – 2012-03-28 21:43:18

+0

在这种情况下,temp必须是一个int向量 – rbelli 2012-03-28 21:44:18

1

数组未存储为十六进制格式;十六进制格式仅适用于阅读和打印。在内部,所有数字都以二进制形式存储。

要读取十六进制数字,您可以使用scanf,并打印十六进制数字,您可以使用printf。要让scanf知道您希望它读取十六进制数字,请使用格式说明符%x。如果你想读取char而不是int, use the modifier 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; 
} 

注意,我在一个虚拟的字符输入后读取,检查包含垃圾在最后输入。这可能或可能不是您的用例所必需的。

相关问题