C语言字符串格式化处理(转)
来源:互联网 发布:c语言和java哪个工资高 编辑:程序博客网 时间:2024/04/29 05:31
复杂的字符串还真不是一件易事。
最近开始喜欢上这个函数 sscanf.
int sscanf(constchar*buffer, constchar*format [, argument ] ... );
在stdlib中,scanf和printf有好多版本:
fscanf和fprintf是分别从流中格式化输入输出的。
scanf和fprintf是从标准设备中格式化输入输出的。
sscanf和sprintf则是向字符缓冲区中格式化输入输出的。
这些函数除了重定向的源和目的不同外,最为核心和强大的都是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]表示包含任意a、b、c的字符串(前闭后开的区间).
一个 ^ 符号表示否定、去除的意思。例如%[^abc]表示除了a,b,c的任意字符.
这些符号可以组合使用.
%{format%}
尽可能多地重复匹配这个格式,匹配结果是一个数组的数组。例如%{%d%} 匹配0个或多个整数.
%%
表示一个百分号%字符.类似于转义字符.
如果有星号(*)被放到了百分号%和格式说明符之间,如%*d, 则函数只会匹配这个格式说明符,会忽略第一个匹配说明符之前的字符。
sscanf函数返回成功匹配的字符占所有字符的百分比的一个整数(范围从0到100).
如果一个匹配不成功,那么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]匹配了A,temp[1]匹配了@R0
sscanf( line, "%*[^ ] %[^,]", temp[0] );
首先根据%*[^ ],可以忽略前面的"MOV",接着是一个空格,最后匹配到’,‘为止。
sscanf( line, "%*[^,],%[^\n]", temp[1] ); //操作数 @R0
首先根据%*[^,],匹配并忽略','之前的所以字符,然后再匹配直到行末尾。
- C语言字符串格式化处理(转)
- C语言字符串格式化处理(转)
- C语言字符串格式化处理 sscanf函数
- C语言格式化字符串
- C语言中格式化字符串
- [收藏]C语言格式化字符串
- C语言字符串格式化显示
- C语言字符串格式化显示
- c语言中的格式化字符串
- C语言字符串处理
- 字符串处理c语言
- c语言 字符串处理
- C语言字符串处理
- C语言字符串处理
- C语言中字符串的格式化
- C语言 格式化输出与字符串操作
- C语言中字符串的格式化
- C语言中字符串的格式化
- 学习相关网站
- ffmpeg优化
- java中的日期相关的问题
- 车道检测问题探究(一)车道特征提取(上)
- Java程序员从笨鸟到菜鸟之(三十)javascript弹出框、事件、对象化编程
- C语言字符串格式化处理(转)
- 大数据里的小利器——Strata 2012大会见闻
- java文件/文件夹操作
- Tasks and Back Stack
- printf 字符串格式化
- Unix/Linux下删除Oracle控制文件Controlfile为什么实例Instance没有立即奔溃?
- 黄金矿工 PC移植版 【安卓游戏】
- 为什么选择QT进行跨平台图形编程
- C#内存管理与垃圾回收