C语言 | 格式化输入的格式说明

C语言 | 格式化输入

下面这一句代码是啥意思?

sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid);

原代码

    get_dev_ssid(wifi_ssid);
    APP_LOG_W("wifi_ssid:%s\n", wifi_ssid);
    sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid);
    APP_LOG_W("wifi_ssid:%s\n", wifi_ssid);

运行LOG:

WIFI initialized
wifi_on end with 0.
[    3.348][I/WLAN.lwip][rt_wlan_lwip_protocol_register:499] eth device init ok name:w0
[    3.348][app_inf][wifi_set_ap_thread:3727]: ap mode self starting success!
[    3.348][app_inf][wifi_start_ap:3537]: start channel select:
[    3.348][app_inf][wifi_start_ap:3563]: ch: 7
[    3.348][app_wrn][wifi_start_ap:3584]: dev_ssid:Akenori vr02_34756372fe3f
<app_cfg.c>(5267 )[get_dev_ssid] Akenori vr02_34756372fe3f       
[    3.757][app_wrn][wifi_start_ap:3602]: wifi_ssid:Akenori vr02_34756372fe3f       
[    3.757][app_wrn][wifi_start_ap:3604]: wifi_ssid:Akenori
[    3.757][app_wrn][wifi_start_ap:3608]: wifi_pwd:1234567890
[    3.985][I/RTL_WIFI_DRV][rtl_wifi_ap_start:167] Akenori started

[    3.985][I/WLAN.mgnt][rt_wlan_start_ap:1499] start ap successs!
[    3.985][app_inf][wifi_set_ap_thread:3737]: wifi start ap success!
[DHCP] dhcpd_start: w0
[DHCP] ip_start: [192.168.169.2]
[DHCP] ip_start: [192.168.169.254]

这是一种scanf()的用法, 给字符串赋值, 从第一个字母开始, 非标点继续, 遇到标点停止

"%[0-9a-zA-Z_-]*"

[ ] 中是格式中可以包含的字符, 这里就是数字, 大小写字母, 以及上下下划线


星号 * 是字符数量可以是多个, 看个示例, 很简单

#include <stdio.h>
#include <string.h>

int main()
{
    char wifi_ssid[] = "0addfFF_-,;Ad";
    sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid);
    printf("%s\n", wifi_ssid);

    strcpy(wifi_ssid, "0a;ddfFF_-,Ad");
    sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid);
    printf("%s\n", wifi_ssid);

    strcpy(wifi_ssid, ";0addfFF_-,Ad");
    sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid);
    printf("%s\n", wifi_ssid);

    return 0;
}
遇到 ,; 结束赋值
0addfFF_-
0a
第一个就是 ; 那就根本不赋值, 所以字符串不变.
;0addfFF_-,Ad

就是个正则表达式

【以下回答由 GPT 生成】

sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid)函数调用的作用是从wifi_ssid字符串中提取符合给定格式说明的内容,并将提取的结果保存在wifi_ssid字符串中。

具体解释:

sscanf函数是一个格式化输入函数,类似于printfsprintf。它的作用是根据给定的格式说明将输入字符串中的内容提取出来并按照提供的格式进行解析。

在这个代码段中,sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid)的格式说明"%[0-9a-zA-Z_-]*"表示匹配一个满足包含0-9、a-z、A-Z、下划线(_)和破折号(-)字符的字符串,并且该字符串可以为空。匹配到的字符串会被存储在wifi_ssid中,这里相当于是将wifi_ssid字符串中满足指定格式的内容重新赋值给wifi_ssid变量。

通过该函数的调用,可以在wifi_ssid字符串中提取出符合特定规则的部分,并将其赋值给同一个变量,实现对字符串内容的过滤和重新赋值的目的。

根据提供的运行LOG,wifi_ssid的初始值是"Akenori vr02_34756372fe3f",经过sscanf函数调用后,再次打印wifi_ssid的值为"Akenori"。可以推断出该函数的作用是将wifi_ssid字符串中除去空格和以后的内容进行截断,只保留第一个非空字符至破折号(-)前的部分。 因此,sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid)的作用是将wifi_ssid字符串中除去特定字符及其后的部分截断,并将截断后的结果存储在wifi_ssid中。

请注意,尽管sscanf函数调用的目的是提取特定格式的内容,但是由于给定的格式说明为"%[0-9a-zA-Z_-]*",匹配的结果为一个空字符串或满足指定范围的字符串。在这种情况下,sscanf函数并不会实际提取任何内容,只是将wifi_ssid字符串中原有的内容保留在其中。

因此,在给定的代码段中,sscanf(wifi_ssid, "%[0-9a-zA-Z_-]*", wifi_ssid)函数调用的作用是截断wifi_ssid字符串,并将截断后的结果保存在wifi_ssid中。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^