我有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;
}
答案 0 :(得分: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
是十六进制还是小数?假设你真正追求的是:
MAC
中的第2,第3,第4和第5个十六进制字段转换为整数。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