字符串裁剪 sscanf的工作上用法

一、概述
sscanf()函数非常实用的 C 语言标准库函数,用于从字符串中按照指定的格式解析数据。它在处理字符串数据时非常有用,尤其是在需要从文本中提取特定数据时。
原函数:int sscanf(const char *str, const char *format, …);
二、实例:
1、使用sscanf 碰到特殊字符‘\’'_'这种就要像下面写

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


int main()
{
    char string1[50] = "A:\\path\\event\\000134_PO20240615.mp4";
    char string2[10] = {};
    char string3[10] = {};
    char string4[10] = {};
    char string5[80] = {};
    char c_number[10] = {};
    char c_data[50] = {};
    printf("string1 = %s\r\n",string1);
    sscanf(string1,"%[^\\]\\%[^\\]\\%[^\\]\\%s",string2,string3,string4,string5);
    printf("string2 = %s\r\n",string2);
    printf("string3 = %s\r\n",string3);
    printf("string4 = %s\r\n",string4);
    printf("string5 = %s\r\n",string5);
    sscanf(string5,"%[^_]_%s",c_number,c_data);
    printf("string1 = %s\r\n",string1);
    printf("c_number = %s\r\n",c_number);
    printf("c_data = %s\r\n",c_data);
    return  0;
}

运行结果:
在这里插入图片描述
也可以用这种换%d出来

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


int main()
{
    char string1[50] = "A:\\path\\event\\000134_PO20240615.mp4";
    char string2[10] = {};
    char string3[10] = {};
    char string4[10] = {};
    char string5[80] = {};
    char c_number[10] = {};
    char c_data[50] = {};
    int number = 0;
    printf("string1 = %s\r\n",string1);
    sscanf(string1,"%[^\\]\\%[^\\]\\%[^\\]\\%s",string2,string3,string4,string5);
    printf("string2 = %s\r\n",string2);
    printf("string3 = %s\r\n",string3);
    printf("string4 = %s\r\n",string4);
    printf("string5 = %s\r\n",string5);
    sscanf(string5,"%d_%s",&number,c_data);
    printf("string1 = %s\r\n",string1);
    //printf("c_number = %s\r\n",c_number);
    printf("c_data = %s\r\n",c_data);
    //number = atoi(c_number);
    printf("number = %d\r\n",number);
    return  0;
}

运行结果
在这里插入图片描述

function parseIMUGPSData(filename) % 初始化存储数据的数组 rawimuaData = []; insattaData = []; % 打开文件 fileID = fopen(filename, 'r'); if fileID == -1 error('无法打开文件'); end % 逐行读取文件 line = fgetl(fileID); while ischar(line) % 解析RAWIMUA数据 if startsWith(line, '#RAWIMUA') [gpsWeek, second, status, accelX, accelY, accelZ, gyroX, gyroY, gyroZ] = ... parseRAWIMUALine(line); rawimuaData = [rawimuaData; gpsWeek, second, status, accelX, accelY, accelZ, gyroX, gyroY, gyroZ]; % 解析INSATTA数据 elseif startsWith(line, '#INSATTA') [gpsWeek, second, roll, pitch, yaw, insStatus] = ... parseINSATTAline(line); insattaData = [insattaData; gpsWeek, second, roll, pitch, yaw, insStatus]; end % 读取下一行 line = fgetl(fileID); end % 关闭文件 fclose(fileID); % 显示解析后的数据 disp('RAWIMUA 数据:'); disp(rawimuaData); disp('INSATTA 数据:'); disp(insattaData); end function [gpsWeek, second, status, accelX, accelY, accelZ, gyroX, gyroY, gyroZ] = ... parseRAWIMUALine(line) % 提取数据字段 parts = strsplit(line, {',',';', '*'}); gpsWeek = str2double(parts{6}); second = str2double(parts{7}); status = sscanf(parts{4}, '%x'); % 十六进制转十进制 accelX = str2double(parts{10}); accelY = str2double(parts{11}); accelZ = str2double(parts{12}); gyroX = str2double(parts{13}); gyroY = str2double(parts{14}); gyroZ = str2double(parts{15}); end function [gpsWeek, second, roll, pitch, yaw, insStatus] = parseINSATTAline(line) % 提取数据字段 parts = strsplit(line, {',',';', '*'}); gpsWeek = str2double(parts{6}); second = str2double(parts{7}); roll = str2double(parts{10}); pitch = str2double(parts{11}); yaw = str2double(parts{12}); insStatus = sscanf(parts{4}, '%x'); % 十六进制转十进制 end
最新发布
06-20
### C语言中使用 `sscanf` 分割字符串 #### 函数概述 `sscanf` 是一种功能强大的工具,能够从给定的字符串中按特定格式提取数据。它的基本形式为: ```c int sscanf(const char *str, const char *format, ...); ``` 其中,`str` 表示待解析的字符串;`format` 定义了期望的格式模式;后续参数则依次对应于要填充的目标变量地址。 该函数返回成功匹配并赋值的字段数量[^2]。 --- #### 示例代码及其解析 下面通过具体例子展示如何利用 `sscanf` 实现字符串分割: 假设有一个字符串 `"AT+IMPORTFILE="xiaohai.txt",123456"` 需要从中提取文件名 (`xiaohai.txt`) 和其大小 (`123456`)。 ##### 示例代码 ```c #include <stdio.h> #include <string.h> int main() { char* str = (char*)"AT+IMPORTFILE=\"xiaohai.txt\",123456"; char filename[64] = { 0 }; int filesize = 0; // 调用 sscanf 进行字符串解析 int ret = sscanf(str, "AT+IMPORTFILE=\"%[^\"]\",%d", filename, &filesize); printf("Return value of sscanf: %d\n", ret); // 输出返回值以验证匹配项的数量 printf("Extracted Filename: %s\n", filename); // 打印提取的文件名 printf("Extracted File Size: %d\n", filesize); // 打印提取的文件大小 return 0; } ``` ##### 解析过程 1. **输入字符串**: 输入字符串为 `"AT+IMPORTFILE="xiaohai.txt",123456"`。 2. **格式说明符**: - `%[^\"]`: 提取直到遇到双引号 (`"`) 的所有字符,并将其存入目标数组 `filename` 中。这里 `[^\"]` 表达的是“除双引号外的所有字符”。 - `,`: 匹配逗号作为分隔符。 - `%d`: 将紧随逗号之后的内容解释为整数,并存储至变量 `filesize` 中。 3. **返回值分析**: 如果两个部分均被成功识别,则 `ret` 应等于 `2`,表示有两个字段被正确解析。 4. **运行结果**: 假设程序正常执行,输出应如下所示: ``` Return value of sscanf: 2 Extracted Filename: xiaohai.txt Extracted File Size: 123456 ``` --- #### 注意事项 - 格式控制字符串的设计至关重要,需精确反映源字符串结构。如果实际数据不符合预期格式,可能导致错误或不完全的结果。 - 对于复杂场景下的字符串处理任务,可能还需要结合其他辅助手段(如预处理替换特殊字符),以便更好地适配 `sscanf` 的能力范围[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值