-3

我有char *MAC="aa:bb:cc:dd:ee:ff:99"。在此字符串中,所有值均采用“十六进制”格式。

我怎样才能将它存储到另一个字符串中并删除前两个数字,最后四个数字应该是这样的: "ss.ttt.uu.vv".

这里 ss 是“cc”的小数,ttt 同样是“dd”的小数。

#define DELIM ":"
int tok(char *str_to_tokenize)
{
 // char str_to_tokenize[] = "- Strtok is meant for - breaking up, strings with funny values. + 5";
  char *str_ptr;

  fprintf(stdout, "Split \"%s\" into tokens:\n", str_to_tokenize);

  str_ptr = strtok(str_to_tokenize, DELIM);
  for(; str_ptr != NULL ;){
    fprintf(stdout, "%s\n", str_ptr);
    str_ptr = strtok(NULL, DELIM);
  }

  return 0;
}

int main()
{
  char* buffer="aa:bb:c:dd:ee:ff:gg";
  tok(buffer);
  return 0;
}
4

1 回答 1

2

sscanf()对我来说,这看起来像是一个案例snprintf()。然而,这个问题令人困惑:

我有char *MAC="aa:bb:cc:dd:ee:ff:99"。在此字符串中,所有值均采用“十六进制”格式。

我怎样才能 [...] 像这样删除前两个数字和后四个数字:“ss.ttt.uu.vv”。

你在数数字还是数字?如果你在计算数字,去掉前两个意味着“aa”和“bb”被忽略,去掉最后四个意味着“dd”、“ee”、“ff”和“99”也被忽略。如果您在计算数字,则忽略“aa”、“ff”和“99”,留下 4 个数字(8 位)以格式化为 4 部分虚线数字。总的来说,数数更有意义。

然后你说:

这里 ss 是“cc”的小数,ttt 同样是“dd”的小数。

如果 的第一个字段ss.tt.uu.vv是 的十进制等效项cc,第二个字段是 的十进制等效项dd,则:

  • bb去哪里做ee
  • uu和是vv十六进制还是十进制?

假设你真正追求的是:

  • 将第 2、3、4 和 5 个十六进制字段转换MAC为整数。
  • 将结果显示为sss.ttt.uuu.vvv原始顺序中十六进制值的十进制等效值。

这可以实现为:

#include <stdio.h>

int main(void)
{
    int bb, cc, dd, ee;
    const char *MAC = "aa:bb:cc:dd:ee:ff:99";
    char output[16] = "";

    if (sscanf(MAC, "%*x:%x:%x:%x:%x:", &bb, &cc, &dd, &ee) == 4)
        snprintf(output, sizeof(output), "%d.%d.%d.%d", bb, cc, dd, ee);

    printf("MAC = %s; result = %s\n", MAC, output);
    return(0);
}

转换规范的%*x意思是“读取一个十六进制整数并且不将其分配给变量”。

示例输出:

MAC = aa:bb:cc:dd:ee:ff:99; result = 187.204.221.238
于 2013-02-23T07:39:40.297 回答