C语言字符串格式化处理 sscanf函数

本文深入介绍了C语言中的sscanf函数,解析其格式说明符及应用案例。通过具体实例展示了如何利用sscanf处理复杂的字符串,包括从字符串中抽取特定格式的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近开始喜欢上这个函数 sscanf.

int sscanf(constchar*buffer,   constchar*format [,   argument ] ... );

stdlib中,scanfprintf有好多版本:

fscanffprintf是分别从流中格式化输入输出的。

scanfprintf是从标准设备中格式化输入输出的。

sscanfsprintf则是向字符缓冲区中格式化输入输出的。

这些函数除了重定向的源和目的不同外,最为核心和强大的都是format的支持。

下面以sscanf为例,小结一下各个参数的强大功能。

一、常见格式说明符:

%d

十进制整数.

%o

八进制整数   0.

%x

十六进制整数 0x.

%D


一个十进制整数,如果以0开始,则为八进制,如果以0x开始,则为十六进制.

%f


浮点数.


%c

单个字符.

%s


一个字符串。如果%s后面跟一个%d,%s只会匹配所有非数字的字符如果后面跟一个%[],%s会匹配所有的没有在%[]中出现的字符如果后面跟普通字符串text,%s会匹配所有的字符,直到text的第一次出现.


%Ns

如上,匹配一个长度为N的字符串.

%[characters]


一个字符串包含任意characters列表中的字符.

一个减号可以用来表示范围。例如%[a-d]表示包含任意abc的字符串(前闭后开的区间).

一个 符号表示否定、去除的意思。例如%[^abc]表示除了a,b,c的任意字符.

这些符号可以组合使用.


%{format%}


尽可能多地重复匹配这个格式,匹配结果是一个数组的数组。例如%{%d%} 匹配0个或多个整数.


%%

表示一个百分号%字符.类似于转义字符.

如果有星号(*)被放到了百分号%和格式说明符之间,如%*d, 则函数只会匹配这个格式说明符,会忽略第一个匹配说明符之前的字符。

sscanf函数返回成功匹配的字符占所有字符的百分比的一个整数(范围从0100).

如果一个匹配不成功,那么sscanf会立即返回,没有成功匹配的参数值不会改变。

二、实例

1、网上流传很广的周星星(具体是谁,我也不知道,姑且这么称呼)的一段代码

#include <stdio.h>
int main()

          const char* s = "iios/12DDWDFF@122"; 
          char buf[20]; 
          sscanf( s, "%*[^/]/%[^@]", buf );

          printf( "%s\n", buf ); 
          return 0;
}
结果为:12DDWDFF

其中

%*[^/],匹配了从开始到第一个'/'字符字符出现以前的字符串,由于有'*',则将这部分忽略掉。

/,匹配该反斜杠'/'

%[^@],匹配到第一个'@'之前的所有字符串,即12DDWDFF

2、最近正在做的一个类似编译后端的程序中的一个例子。

要解析诸如 mov A,R0之类的汇编指令序列

#include <stdio.h>
int main()

          char* line ="MOV A,@R0\n";

          char temp[2][10];

          sscanf( line, "%*[^ ] %[^,]", temp[0] );       //操作数 A

          sscanf( line, "%*[^,],%[^\n]", temp[1] );      //操作数 @R0

          return 0; 

}

本例中temp[0]匹配了Atemp[1]匹配了@R0

sscanf( line, "%*[^ ] %[^,]", temp[0] );

首先根据%*[^ ],可以忽略前面的"MOV",接着是一个空格,最后匹配到为止。

sscanf( line, "%*[^,],%[^\n]", temp[1] );     //操作数 @R0

首先根据%*[^,],匹配并忽略','之前的所以字符,然后再匹配直到行末尾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值