sscanf的用法

#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. 包含指定字符集的字符串。如在下例中,取包含19和小写字母的字符串。

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
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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值