sscanf函数提取格式化数据


在开发的过程中,有如下的代码:

    unsigned char macAddr1[6] = {0};
    unsigned char macAddr2[6] = {0};
......

    for(index = 0; index < KEY_LEN_MAC;)
    {
......
        sscanf(macTmp, "%x", &macAddr1[iMac]);
        macAddr2[iMac] = macAddr1[iMac];
......

就是把 macTmp 中的数据,按照 "%x" 格式提取到 macAddr1[] 中;

//========================================================================

在测试的过程中,发现 for() 循环操作完之后;

macAddr2[0] 元素的数据自动被修改了;

但是,我们并没有在代码中手动修改这个元素的值;

//========================================================================

那么,自己推理,macAddr1[], macAddr2[] 元素定义在一起,而且容量小;

那么,编译器为其分配空间的时候,就是一串连续的内存块;

其中,macAddr2 元素接在 macAddr1 之后,例如:

0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
--- macAddr1 ---  --- macAddr2 ---

那么,macAddr2[0] 元素就接在 macAddr1[5] 元素之后;

//========================================================================

所以,自己推理 sscanf() 函数在操作 macAddr1[5] 元素的时候,编译器在为 macAddr1[5] 元素赋值的时候,修改到了 macAddr2[0] 元素;

所以,有如下的测试例子:

//========================================================================

给 buf[] 数组初始化为 0xee 数值,然后,把 "f5" 字符串通过 sscanf() 函数提取出来;

填充到 buf[0] 元素中;

最终,打印 buf[] 数组,可以看到影响了 buf[1], buf[2] 等元素;

int main(void){
    char *p = "f5";
    unsigned char buf[8] = {0};

    memset(buf, 0xee, 8);
    sscanf(p, "%x", buf);
    int i;
    for(i = 0; i < 8; i++)
    {
        printf("buf[%d]=%.2x\n", i, buf[i]);
    }
        
    printf("\n");
    printf("hehe ...\n");
    return 0;
}

运行结果如下:

[openwrt@localhost64 test]$ gcc test1.c -o out
[openwrt@localhost64 test]$ ./out
buf[0]=f5
buf[1]=00
buf[2]=00
buf[3]=00
buf[4]=ee
buf[5]=ee
buf[6]=ee
buf[7]=ee

hehe ...


//========================================================================

只需要99元就可以投资自己,掌握Linux系统编程!主要传授《Linux C/C++程序设计》《Linux 系统编程》,主页有学习视频!
只需要99元就拥有全部课程和资料,让我们用技术改变自己,改变生活,改变世界!
视频可以百度搜索:韦凯峰Linux编程学堂
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值