#include<stdio.h>
定义函数 int sscanf (const char *str,const char * format,........);
函数说明
sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。
返回值成功则返回参数数目,失败则返回-1,错误原因存于errno中。返回0表示失败 否则,表示正确格式化数据的个数 例如:sscanf(str,"%d%d%s",&i,&i2, &s); 如果三个变成都读入成功会返回3。 如果只读入了第一个整数到i则会返回1。证明无法从str读入第二个整数。
int main()
{
<span style="white-space:pre"> </span>int i;
<span style="white-space:pre"> </span>unsigned int j;
<span style="white-space:pre"> </span>char input[ ] = ”10 0x1b aaaaaaaa bbbbbbbb”;
<span style="white-space:pre"> </span>char s[5];
<span style="white-space:pre"> </span>sscanf(input, ”%d %x %5[a-z] %*s %f”, &i, &j, s, s);
<span style="white-space:pre"> </span>printf(“%d %d %s ”, i, j, s);
}
执行 10 27 aaaaa
大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。
1. 常见用法。
charstr[512]={0};
sscanf("123456","%s",str);
printf("str=%s",str);
123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456","%4s",str);
printf("str=%s",str);
1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf","%[^]",str);
printf("str=%s",str);
123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);
printf("str=%s",str);
123456abcdedf
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF","%[^A-Z]",str);
printf("str=%s",str);
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 /和 @ 之间的字符串,
先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]",buf);
printf("%s\n",buf);
结果为:12DDWDFF
7、给定一个字符串“hello, world”,仅保留world。
(注意:“,”之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串)
sscanf(“hello,world”,"%*s%s",buf);
printf("%s\n",buf);
结果为:world
8、给字符串“abcd&12&08:5F:23:56:46:E3&34”,赋值给如下结构体
typedef struct{
char software[32];
int cpu;
char mac[64];
int mem;
}SYSINFO;
可以使用
char s[]="abcd&12&08:5F:23:56:46:E3&34";
sscanf(s,"%[^&]&%d&%[^&]&%d", a.software, &a.cpu, a.mac, &a.mem);
printf("%s\n",s);
printf("%s&%d&%s&%d\n",a.software, a.cpu, a.mac, a.mem);
sscanf(s,
"%31[^&]&"
"%d&"
"%63[^&]&"
"%d",
a.software,
&a.cpu,
a.mac,
&a.mem)
结果是:
abcd&12&08:5F:23:56:46:E3&34
9.解析如下字符串:
Registrations:
=================================================================================================
Call-ID: 1282389322@192.168.1.169
User: 1000@192.168.1.63
Contact: "1000" <sip:1000@192.168.1.169:5062;transport=TCP;fs_nat=yes;fs_path=sip%3A1000%40192.168.1.169%3A1570%3Btransport%3DTCP>
Agent: Yealink SIP-T20P 9.61.0.70
Status: Registered(TCP-NAT)(unknown) EXP(2014-06-23 10:32:57) EXPSECS(91)
Host: c8dev.mycomm.cn
IP: 192.168.1.169
Port: 1570
Auth-User: 1000
Auth-Realm: 192.168.1.63
MWI-Account: 1000@192.168.1.63
Call-ID: 1498574971-5060-1@BJC.BGI.B.BFC
User: 6001@192.168.1.63
Contact: "" <sip:6001@192.168.1.152:5060>
Agent: Grandstream GXP1400 1.0.4.13
Status: Registered(UDP)(unknown) EXP(2014-06-23 10:33:18) EXPSECS(112)
Host: c8dev.mycomm.cn
IP: 192.168.1.152
Port: 5060
Auth-User: 6001
Auth-Realm: 192.168.1.63
MWI-Account: 6001@192.168.1.63
Total items returned: 6
=================================================================================================
解析后组装成:
:[ {<<" ">>,<<" ">>,<<" ">>...}, {.....} ],
合理使用函数strstr和sscanf函数
#include <stdio.h>
#include <string.h>
char src[2000]="\nRegistrations:\n=================================================================================================\nCall-ID: \t1282389322@192.168.1.169\nUser: \t1000@192.168.1.63\nContact: \t\"1000\" <sip:1000@192.168.1.169:5062;transport=TCP;fs_nat=yes;fs_path=sip%3A1000%40192.168.1.169%3A1570%3Btransport%3DTCP>\nAgent: \tYealink SIP-T20P 9.61.0.70\nStatus: \tRegistered(TCP-NAT)(unknown) EXP(2014-06-23 10:32:57) EXPSECS(91)\nHost: \tc8dev.mycomm.cn\nIP: \t192.168.1.169\nPort: \t1570\nAuth-User: \t1000\nAuth-Realm: \t192.168.1.63\nMWI-Account:\t1000@192.168.1.63\n\nCall-ID: \t1498574971-5060-1@BJC.BGI.B.BFC\nUser: \t6001@192.168.1.63\nContact: \t\"\" <sip:6001@192.168.1.152:5060>\nAgent: \tGrandstream GXP1400 1.0.4.13\nStatus: \tRegistered(UDP)(unknown) EXP(2014-06-23 10:33:18) EXPSECS(112)\nHost: \tc8dev.mycomm.cn\nIP: \t192.168.1.152\nPort: \t5060\nAuth-User: \t6001\nAuth-Realm: \t192.168.1.63\nMWI-Account:\t6001@192.168.1.63\n\nTotal items returned: 6\n=================================================================================================\n";
typedef struct{
char callId[32];
char user[32];
char contact[128];
char agent[32];
char status[128];
char host[32];
char ip[32];
char port[8];
char authUser[8];
char authRealm[32];
char mwlAccount[32];
}info;
int main()
{
int flag=0;
char dst[2000]={0};
char *s=src;
info data;
printf("%s", s);
sprintf(dst,"%s","[");
s = strstr(s,"Call-ID");
while(s && (11 == sscanf(s,
"Call-ID: \t%31[^\n]\n"
"User: \t%31[^\n]\n"
"Contact: \t%127[^\n]\n"
"Agent: \t%31[^\n]\n"
"Status: \t%128[^\n]\n"
"Host: \t%31[^\n]\n"
"IP: \t%31[^\n]\n"
"Port: \t%7[^\n]\n"
"Auth-User: \t%7[^\n]\n"
"Auth-Realm: \t%31[^\n]\n"
"MWI-Account:\t%31[^\n]\n",
data.callId,
data.user,
data.contact,
data.agent,
data.status,
data.host,
data.ip,
data.port,
data.authUser,
data.authRealm,
data.mwlAccount))){
if(flag == 1){
sprintf(dst,"%s,",dst);
}else{
flag=1;
}
sprintf(dst,
"%s{<<\"%s\">>,<<\"%s\">>,<<\"%s\">>,<<\"%s\">>,<<\"%s\">>,<<\"%s\">>,<<\"%s\">>,<<\"%s\">>,<<\"%s\">>,<<\"%s\">>,<<\"%s\">>}",
dst,data.callId,data.user,data.contact,data.agent,data.status,data.host,data.ip,data.port,data.authUser,data.authRealm,data.mwlAccount);
printf("%s\n",dst);
s = s + strlen("Call-ID:");
s = strstr(s,"Call-ID");
}
sprintf(dst,"%s]",dst);
return 0;
}