IT评测·应用市场-qidao123.com

标题: C语言全网最全sscanf函数用法,没有的评论区提,随时更新 [打印本页]

作者: 海哥    时间: 2024-8-3 04:55
标题: C语言全网最全sscanf函数用法,没有的评论区提,随时更新
        本教程分低级、进阶、实战用例,有底子的直接跳到背面吧。本文重要拿AT指令做例子。写得不好别喷,合理的要求可以提出来我尽力改。 本教程应该足以面对大部门的解析。
        最后部门重要是实战为主。各位有想解析的字符串可以放到评论区,比较经典的我会放到文章里。
一、函数原型解析

        直接看以下:
  1. #include <stdio.h>  /* 引用这个标准的头文件 */
  2. /**
  3. * @function: sscanf
  4. * @brief C语言格式化输入函数,可用作解析字符串中的参数。
  5. * @param {char} *str: 源字符串,也就是要被解析的字符串。
  6. * @param {char} *format: 解析格式。
  7. * @param {...} 要取出的值,要取几个?要取什么类型的?排好队,一个一个来
  8. * @return {int} 返回int类型,返回值代表解析了几个值。
  9. */
  10. int sscanf(const char *str, const char *format, ...);
复制代码

二、低级用法

        这里包含了最底子的%s, %d, %f的用法。你想取出什么范例的值就用什么范例的方法。新手一定一定要注意格式!
1. 取字符串 %s

        这里会把你输入的   AT+COM=  过滤掉,取出背面的所有字符串。
  1. /*
  2. * @Author: Troubadour 2276791354@qq.com
  3. * @Date: 2024-04-20 19:47:51
  4. * @LastEditors: Troubadour 2276791354@qq.com
  5. * @LastEditTime: 2024-04-20 20:10:09
  6. * @Version:
  7. * @Description:
  8. */
  9. #include <stdio.h>
  10. #define STR     "AT+COM=aabbcc"
  11. void main(void)
  12. {
  13.     int result = 0;
  14.     char str_para1[50] = {0};
  15.     result = sscanf(STR, "AT+COM=%s", str_para1);
  16.     printf("result------> %d \r\n", result);
  17.     printf("parameter1--> %s \r\n", str_para1);
  18. }
复制代码
        输出:
  1. result------> 1
  2. parameter1--> aabbcc
复制代码
        假如你想只取指定数目的字符串,好比3个两个字符串:
  1. sscanf("AT+COM=aabbcc", "AT+COM=%3s", str_para1);
复制代码
        输出:
  1. result------> 1
  2. parameter1--> aab
复制代码


2. 取整形 %d  大概  %ld。

        这里会把你输入的   AT+COM=  过滤掉,取出背面的整形。
        注意!整形和浮点型这种不是范例的要加取地点符 ‘&’,因为要给你的参数赋值。另外,假如你想取出来的值放在非int范例的变量上,好比单片机常用的uint8_t    uint16_t  uint32_t 这种,不要直接读,程序容易跑飞!
  1. /*
  2. * @Author: Troubadour 2276791354@qq.com
  3. * @Date: 2024-04-20 19:47:51
  4. * @LastEditors: Troubadour 2276791354@qq.com
  5. * @LastEditTime: 2024-04-20 20:10:09
  6. * @Version:
  7. * @Description:
  8. */
  9. #include <stdio.h>
  10. #define STR     "AT+COM=123456,111222333"
  11. void main(void)
  12. {
  13.     int result = 0;
  14.     int para1 = 0;
  15.     long long para2 = 0;
  16.     result = sscanf(STR, "AT+COM=%d,%ld", &para1, &para2);
  17.     printf("result------> %d \r\n", result);
  18.     printf("parameter1--> %d \r\n", para1);
  19.     printf("parameter2--> %ld \r\n", para2);
  20. }
复制代码
输出:
  1. result------> 2
  2. parameter1--> 123456
  3. parameter2--> 111222333
复制代码
        其它整形范例变量读取方法:
  1. /*
  2. * @Author: Troubadour 2276791354@qq.com
  3. * @Date: 2024-04-20 19:47:51
  4. * @LastEditors: Troubadour 2276791354@qq.com
  5. * @LastEditTime: 2024-04-20 20:35:41
  6. * @Version:
  7. * @Description:
  8. */
  9. #include <stdio.h>
  10. #define STR     "AT+COM=11,22"
  11. typedef unsigned char                uint8_t;
  12. typedef unsigned short                uint16_t;
  13. void main(void)
  14. {
  15.     int result = 0;
  16.     int para1 = 0;
  17.     int para2 = 0;
  18.     uint8_t value1 = 0;
  19.     uint16_t value2 = 0;
  20.     result = sscanf(STR, "AT+COM=%d,%ld", &para1, &para2);
  21.     value1 = (uint8_t)para1;
  22.     value2 = (uint16_t)para2;
  23.     printf("result------> %d \r\n", result);
  24.     printf("parameter1--> %d \r\n", para1);
  25.     printf("parameter2--> %ld \r\n", para2);
  26.     printf("value1------> %d \r\n", value1);
  27.     printf("value2------> %ld \r\n", value2);
  28. }
复制代码
输出:
  1. result------> 2
  2. parameter1--> 11
  3. parameter2--> 22
  4. value1------> 11
  5. value2------> 22
复制代码


3. 取浮点型形 %f,建议用%lf。

        这里会把你输入的   AT+COM=  过滤掉,取出背面的浮点型。
        不建议利用float,原因精度差,不信且看例子。非要用大概某些原因限定,那你把值读出来再强制范例转成float,好比将下面para2强制范例转换成float:para1 = (float)para2;
  1. /*
  2. * @Author: Troubadour 2276791354@qq.com
  3. * @Date: 2024-04-20 19:47:51
  4. * @LastEditors: Troubadour 2276791354@qq.com
  5. * @LastEditTime: 2024-04-20 20:20:31
  6. * @Version:
  7. * @Description:
  8. */
  9. #include <stdio.h>
  10. #define STR     "AT+COM=1234.123456,222333.444555666"
  11. void main(void)
  12. {
  13.     int result = 0;
  14.     float para1 = 0;    /* 精度差,建议用 double */
  15.     double para2 = 0;
  16.     result = sscanf(STR, "AT+COM=%f,%lf", &para1, &para2);
  17.     printf("result------> %d \r\n", result);
  18.     printf("parameter1--> %f \r\n", para1);
  19.     printf("parameter2--> %.10f \r\n", para2);
  20. }
复制代码
输出:
  1. result------> 2
  2. parameter1--> 1234.123413      
  3. parameter2--> 222333.4445556660
复制代码
4. 其它格式:

  1. %c 一个单一的字符  
  2. %d 一个十进制整数  
  3. %i 一个整数  
  4. %e, %f, %g 一个浮点数  
  5. %o 一个八进制数  
  6. %s 一个字符串  
  7. %x 一个十六进制数  
  8. %p 一个指针  
  9. %n 一个等于读取字符数量的整数  
  10. %u 一个无符号整数  
  11. %[ ] 一个字符集 (正则就使用这个,而且仅支持贪婪模式,能匹配个多少就匹配多少个) 
  12. %% 一个精度符
复制代码

三、进阶用法字符集: %[]

1. 字符串取值限定用法

        懂点底子了可以看点稍微复杂点的了。现在开始利用一些特殊符号。先来个  %[^,] 用法。

        例如,现在有这么一串字符串,取出背面的所有值。
  1. AT+COM=aabbcc,1234,12.34
复制代码
  1. /* 输入 */
  2. sscanf("AT+COM=aabbcc,1234,12.34", "AT+COM=%[^,],%d,%lf", para1, &para2, &para3);
  3. /* 输出 */
  4. aabbcc
  5. 1234
  6. 12.340000
复制代码
假如是空格作为间隔,则利用:
  1. /* 输入 */
  2. sscanf("AT+COM=aabbcc 1234 12.34", "AT+COM=%[^ ] %d %lf", para1, &para2, &para3);
  3. /* 输出 */
  4. aabbcc
  5. 1234
  6. 12.340000
复制代码
为什么不能用%s,以下错误示范!!!
  1. /* 输入 */
  2. sscanf("AT+COM=aabbcc,1234,12.34", "AT+COM=%s,%d,%lf", para1, &para2, &para3);
  3. /* 输出 */
  4. aabbcc,1234,12.34
  5. 0
  6. 0.000000
复制代码
2. 利用 * 号忽略某个值大概忽略某种范例

        取值时把%[^,]改成%*[^,]可以忽略这个字符串,这时输出只有整形和浮点型
  1. /* 输入 */
  2. sscanf("AT+COM=aabbcc,1234,12.34", "AT+COM=%*[^,],%d,%lf", &para2, &para3);
  3. /* 输出 */
  4. 1234
  5. 12.340000
复制代码
         把%d改成%*d可以再忽略一个整形,这时输出只有浮点型
  1. /* 输入 */
  2. sscanf("AT+COM=aabbcc,1234,12.34", "AT+COM=%*[^,],%*d,%lf", &para3);
  3. /* 输出 */
  4. 12.340000
复制代码
3. 取出限定的字符

        在中括号 [] 放入想要匹配的几个字符,符合条件就会读取。
  1. /* 输入 */
  2. sscanf("AT+COM=abc,1234,12.34", "AT+COM=%[abcdef],%d,%lf", para1, &para2, &para3);
  3. /* 输出 */
  4. abc
  5. 1234
  6. 12.340000
复制代码
         匹配所有的小写字母%[a-z]
  1. /* 输入 */
  2. sscanf("AT+COM=abcuehwiuh,1234,12.34", "AT+COM=%[a-z],%d,%lf", para1, &para2, &para3);
  3. /* 输出 */
  4. abcuehwiuh
  5. 1234
  6. 12.340000
复制代码
          加上A-Z可以匹配所有的大小写字母。
  1. /* 输入 */
  2. sscanf("AT+COM=AAabcuehwiuh,1234,12.34", "AT+COM=%[a-zA-Z],%d,%lf", para1, &para2, &para3);
  3. /* 输出 */
  4. AAabcuehwiuh
  5. 1234
  6. 12.340000
复制代码
        匹配所有的数字%[0-9]。注意,这里匹配出来的是还是字符串,不是整形!
  1. /* 输入 */
  2. sscanf("AT+COM=01238889,1234,12.34", "AT+COM=%[0-9],%d,%lf", para1, &para2, &para3);
  3. /* 输出 */
  4. 01238889
  5. 1234
  6. 12.340000
复制代码
        三种着实可以整合到一起,取出不含特殊符号的字符串
  1. /* 输入 */
  2. sscanf("AT+COM=AAabcuehwiuh123,1234,12.34", "AT+COM=%[a-zA-Z0-9],%d,%lf", para1, &para2, &para3);
  3. /* 输出 */
  4. AAabcuehwiuh123
  5. 1234
  6. 12.340000
复制代码
         匹配一些含特殊符号的字符串,这里注意,假如你想匹配符号 - 需要放到最背面,否则就堕落匹配不了,这是一个非常特殊的符号。
  1. /* 输入 */
  2. sscanf("AT+COM=***+-{}##$$,1234,12.34", "AT+COM=%[*+{}$# -],%d,%lf", para1, &para2, &para3);
  3. /* 输出 */
  4. ***+-{}##$$
  5. 1234
  6. 12.340000
复制代码
四、高阶用法:

        这里重要是实战为主。
1. 解析时间日期

  1. /* 输入 */
  2. result = sscanf("2024-04-20 Sat 22:00:01", "%d-%d-%d %3[^ ] %d:%d:%d",
  3.         &year, &mon, &day, week, &hour, &min, &sec);
  4. /* 输出 */
  5. result------> 7
  6. 2024
  7. 4
  8. 20
  9. Sat
  10. 22
  11. 0
  12. 1
复制代码
2.前面带乱码的情况下过滤并读取

        重要利用%*[^A]的方法一个一个过滤,假如一般过滤到第3个也就差不多了。
  1. /* 输入 */
  2. result = sscanf("xxxLuanMaxxxA  AT+COM=Time,12:20:53\r\n",
  3.                 "%*[^A]%*[^T]%*[^+]+COM=%10[^,],%d:%d:%d",
  4.                 type, &hour, &min, &sec);
  5. /* 输出 */
  6. result------> 4
  7. Time
  8. 12
  9. 20
  10. 53
复制代码

假如你有复杂解析不了的字符串,欢迎评论区发出来,我会挑一些经典的放进文章。
持续更新.............

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4