当前位置: 首页 > news >正文

sscanf函数使用详解

一.sscanf函数

1.函数原型与基本概念

int sscanf(const char *str, const char *format, ...);

核心功能:从字符串中读取格式化输入(String Scan Formatted)

参数说明:

str:源字符串(从中读取数据)

format:格式控制字符串

...:接收数据的变量地址列表

返回值:

成功:返回成功匹配并赋值的参数个数

失败:返回EOF(通常为-1)

无任何匹配:返回0

2.工作原理图解

源字符串: "John 25 75.5"

格式字符串: "%s %d %f"

        ↓   ↓   ↓

        ↓   ↓   ↓

      char* int float

      变量  变量 变量

      

解析流程:

从左到右扫描源字符串

根据格式字符串解析数据

将解析结果存储到对应变量

返回成功赋值的参数数量

关键特性:

不修改源字符串

遇到格式不匹配立即停止

自动跳过空白字符(空格、制表符、换行符)

支持格式控制(宽度、类型等)

二.基础用法示例

1. 基本数据类型解析

char input[] = "John 25 75.5";

char name[20];

int age;

float height;

int count = sscanf(input, "%s %d %f", name, &age, &height);

printf("解析了 %d 个参数\n", count);  // 输出: 3

printf("姓名: %s, 年龄: %d, 身高: %.1f\n", name, age, height);

// 输出: 姓名: John, 年龄: 25, 身高: 75.5

2. 日期解析

char date_str[] = "2023-08-15";

int year, month, day;

sscanf(date_str, "%d-%d-%d", &year, &month, &day);

printf("%04d年%02d月%02d日\n", year, month, day);

// 输出: 2023年08月15日

3. 十六进制解析

char hex_str[] = "0x1A3F";

unsigned int hex_value;

sscanf(hex_str, "%x", &hex_value);

printf("十进制: %u, 十六进制: 0x%X\n", hex_value, hex_value);

// 输出: 十进制: 6719, 十六进制: 0x1A3F

三.实际应用场景

   适用场景:配置文件解析、网络协议处理、数据格式转换、日志分析、字符串数据提取等。

1.配置文件解析

char config_line[] = "timeout = 30; # connection timeout";

char key[20];

int value;

if(sscanf(config_line, "%19s = %d;", key, &value) == 2) {

    printf("配置项: %s = %d\n", key, value);

}

// 输出: 配置项: timeout = 30

2.网络协议解析

char packet[] = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n";

char method[10], path[50], protocol[10], host[50];

sscanf(packet, "%9s %49s %9s\r\nHost: %49[^\r]",

       method, path, protocol, host);

printf("方法: %s\n路径: %s\n协议: %s\n主机: %s\n",

       method, path, protocol, host);

/* 输出:

方法: GET

路径: /index.html

协议: HTTP/1.1

主机: www.example.com */

3.数据清洗与转换

char dirty_data[] = "Price: $1,234.56 USD";

char clean_number[20];

float price;

// 移除非数字字符(保留小数点)

sscanf(dirty_data, "%*[^0-9]%19[0-9.,]", clean_number);

// 移除千位分隔符

char *ptr = clean_number;

while(*ptr) {

    if(*ptr == ',') memmove(ptr, ptr+1, strlen(ptr));

    else ptr++;

}

sscanf(clean_number, "%f", &price);

printf("清洗后价格: %.2f\n", price);

// 输出: 清洗后价格: 1234.56

四.总结

1.安全检查:

验证返回值

使用宽度限制防止溢出

检查输入字符串有效性

2.错误处理:

char input[] = "InvalidData";

int value;

if(sscanf(input, "%d", &value) != 1) {

    fprintf(stderr, "解析错误: %s\n", input);

    // 错误恢复逻辑...

}

3.复杂解析:

分阶段解析复杂字符串

结合strchr/strstr定位关键位置

使用%[]处理不规则格式

4.性能敏感场景:

避免在循环中重复解析相同字符串

对大字符串使用指针操作而非子串复制

考虑使用strtol/strtod处理数字

http://www.dtcms.com/a/275476.html

相关文章:

  • WinSnap 6.1.1 中文版安装教程(64位)- 详细步骤图解
  • 系统分析师-计算机系统-输入输出系统
  • 如何通过多层次测试策略确保 80%+ 测试覆盖率
  • 【Spring AOP】什么是AOP?切点、连接点、通知和切面
  • SELECT ... INTO OUTFILE和LOAD DATA INFILE
  • Power Switch:用途、原理、工作方式及实现方案
  • CSS选择器进行定位
  • OneCode 3.0 DDD领域模型开放接口:基于DSMFactory的架构解析与实践指南
  • OBOO鸥柏丨满天星(MTSTAR)多媒体信息发布系统技术解析
  • Vscode中使用C++代码进行debug
  • Javaweb- 11 MVC架构模式
  • [BJDCTF2020]ZJCTF,不过如此
  • HarmonyOS从入门到精通:动画设计与实现之六 - 动画曲线与运动节奏控制
  • Leetcode百题斩-二分搜索
  • 【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
  • linux_线程概念
  • 死锁的概念 ⚠️
  • 告别频繁登录!Nuxt3 + TypeScript + Vue3实战:双Token无感刷新方案全解析
  • TinyBERT:知识蒸馏驱动的BERT压缩革命 | 模型小7倍、推理快9倍的轻量化引擎
  • python-for循环
  • 【Elasticsearch】昂贵算法与廉价算法
  • UI前端大数据可视化实战策略分享:如何设计符合用户认知的数据可视化流程?
  • 让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息
  • 「日拱一码」025 机器学习——评价指标
  • Android音视频探索之旅 | C++层使用OpenGL ES实现音频渲染
  • 单片机学习笔记.根据芯片数据手册写驱动程序(这里使用的是普中开发版,以DS1302为例)
  • 创建Spring Boot项目
  • 解决‘vue‘ 不是内部或外部命令,也不是可运行的程序
  • 前端开发的「设计鸿沟」:为什么我学了CSS却做不出好看的网页?
  • 用YOLOv5系列教程(1)-用YOLOv5轻松实现设备状态智能监控!工业级教程来了