一个非常强大的字符串函数sscanf

GIT百度天宫的代码

D:\GKOSON_BACK_GARDEN\repository\BAIDU-SDK-GIT\iot-edge-sdk-samples\ota\esp32_baidu_ota_demo\main\libota

看到一个函数:

static void hex_to_decimal(const char *hex_string, unsigned char *arr, size_t arr_len)
{
    const char *pos = hex_string;
    int count;

    for (count = 0; count < arr_len; count++) {
        sscanf(pos, "%2hhx", &arr[count]);
        pos += 2;
    }
}

非常震撼!

测试:

#include <stdio.h>

 
 static void hex_to_decimal(const char *hex_string, unsigned char *arr, size_t arr_len)
{
    const char *pos = hex_string;
    int count;

    for (count = 0; count < arr_len; count++) {
        sscanf(pos, "%2hhx", &arr[count]);
        pos += 2;
    }
}
void show(void *Arr,char len)
{
	char *arr=(char *)Arr;
	for(char i=0;i<len;i++)printf("%02X-",arr[i] );
		printf("\n");
}
int main(int argc,char **argv)
{
	char hex_string[100]="123456";
	unsigned char arr[100]={0};
	hex_to_decimal(hex_string,arr,6);
 	show(hex_string,10 );
 	show(arr,10 );
	return 1;
}

31-32-33-34-35-36-00-00-00-00-
12-34-56-00-00-00-00-00-00-00-
[Finished in 1.0s]

它的作用是把字符串“123456”---》0X12 0X34 0X56这样!!!

 

说明:

1--我可以成功 别人可能需要#include <stdlib.h>

2-- 其实是printf的故事

"%02x",是以0补齐2位数,如果超过2位就显示实际的数;
"%hhx" 是只输出2位数,即便超了,也只显示低两位;
 
因此有了"%02hhx"

也就是 

 static void hex_to_decimal(const char *hex_string, unsigned char *arr, size_t arr_len)
{
    const char *pos = hex_string;
    int count;

    for (count = 0; count < arr_len; count++) {
        sscanf(pos, "%2d", &arr[count]);//------------只需要修改这里就是“123456”---》12 34 56这样!!!
        pos += 2;
    }
}

3--WHY

#include <stdio.h>


int main(int argc,char **argv)
{
	int i, idx = 0;
    char str[20];
    sscanf("aaa bbb ccc", "%*s %s%n", str, &idx);
    printf("%s\n%d\n", str, idx);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当用 `sscanf` 函数提取字符串时,需要注意以下几点,以避免乱码问题: 1. 确认源字符串的编码格式,例如 UTF-8、GBK 等。 2. 确认提取出的字符串所需的编码格式,例如 ASCII、UTF-8、GBK 等。 3. 在 `sscanf` 函数中使用相应的格式控制符,例如 `%s`、`%d`、`%f` 等。 下面是一个示例程序,演示如何使用 `sscanf` 函数提取 UTF-8 编码格式的字符串,并将其转换为 ASCII 编码格式的字符串: ```c #include <stdio.h> #include <string.h> int main() { char src_str[] = "你好,世界!"; char dst_str[100]; int len = strlen(src_str) + 1; // 包括字符串结束符 int i; // 将 UTF-8 编码格式的字符串转换为 ASCII 编码格式的字符串 for (i = 0; i < len; i++) { if (src_str[i] < 0x80) { // 单字节字符 dst_str[i] = src_str[i]; } else if ((src_str[i] & 0xE0) == 0xC0) { // 双字节字符 dst_str[i] = ((src_str[i] & 0x1F) << 6) | (src_str[i+1] & 0x3F); i++; } else if ((src_str[i] & 0xF0) == 0xE0) { // 三字节字符 dst_str[i] = ((src_str[i] & 0x0F) << 12) | ((src_str[i+1] & 0x3F) << 6) | (src_str[i+2] & 0x3F); i += 2; } else { // 四字节字符不支持 printf("Unsupported character!\n"); return -1; } } printf("Source string: %s\n", src_str); printf("Destination string: %s\n", dst_str); // 使用 sscanf 函数提取字符串 char buf[100]; int num; sscanf(dst_str, "%s %d", buf, &num); printf("buf: %s\nnum: %d\n", buf, num); return 0; } ``` 在这个示例程序中,我们首先将 UTF-8 编码格式的字符串转换为 ASCII 编码格式的字符串,然后使用 `sscanf` 函数提取字符串,并输出提取出来的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值