sscanf使用示例
示例:使用sscanf分割文件中的数据,数据源示例如下
川EZ1E58,贵GQ7708,:1302
贵AE0996,:185
贵A0PJ06,贵JYN192,贵JYN192,:128
分割代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <stdio.h>
#include <string.h>
int DealLine( char *StrLine)
{
// find : data save
char Parkid[20] = "" ;
char *p = StrLine;
char *prt = StrLine;
char carNum[20] = "" ;
if (p = strstr (p, ":" ))
{
p = p + 1;
strncpy (Parkid,p,20);
printf ( "Parkid == %s" ,Parkid);
} else {
return -1;
}
char endflag = 0;
while (1){
endflag = *prt;
if (endflag == 58)
{
return 0;
}
memset (carNum ,0, 20);
sscanf (prt, "%[^,]" ,carNum);
prt = strstr (prt, "," );
prt = prt + 1;
printf ( "carNum = %s \n" ,carNum);
}
}
int main( void )
{
FILE *fp;
char StrLine[1024] = "" ;
fp = fopen ( "./test1.txt" , "r" ); //判断文件是否存在及可读
if (fp == NULL)
{
printf ( "open fail" );
return -1;
}
while (! feof (fp)){
fgets (StrLine,1024,fp); //读取一行
printf ( "\n\n\n" );
printf ( "%s\n" ,StrLine);
int ret = DealLine(StrLine);
}
fclose (fp);
return 0;
}
|
补充知识:sscanf从字符串中按照指定格式提取数据
我们在学习C语言的时候,一定都使用过scanf函数,它表示从标准输入中按照指定格式接收数据到变量。实际编程中,我们常常希望能从字符串中,提取想要的数据时,此时我们就可以派上sscanf函数了.
sscanf
sscanf 函数声明如下:
int sscanf( const char* str, const char* format, ... );
它表示从字符串str中按照format格式提取数据到指定变量中。
sprintf
常常和sscanf配合使用的是sprintf函数,其函数声明如下:
int sprintf(char *buffer, const char *format, ...);
它表示提取变量中的数据按照指定格式组装成一个字符串。
用例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
//提取姓名和年龄
char sentence[] = "Rudolph is 12 years old" ;
char name[20] = {};
int age = 0;
sscanf (sentence, "%s is %d" , name, &age);
printf ( "name : %s age: %d\n" , name, age);
//将字符串进行每两位进行分割,最后一位分割为是一位数.
const char * pszClassID = "1234070809001" ;
unsigned char ucFillMsg[128] = {};
char szSrcMsg[128] = {};
sscanf (pszClassID, "%2d%2d%2d%2d%2d%2d%1d" ,
&ucFillMsg[0],
&ucFillMsg[1],
&ucFillMsg[2],
&ucFillMsg[3],
&ucFillMsg[4],
&ucFillMsg[5],
&ucFillMsg[6]);
//还原为字符串,不足两位左边补0
sprintf (szSrcMsg, "%02d%02d%02d%02d%02d%02d%01d" ,
ucFillMsg[0],
ucFillMsg[1],
ucFillMsg[2],
ucFillMsg[3],
ucFillMsg[4],
ucFillMsg[5],
ucFillMsg[6]);
printf ( "src string : %s\n" , szSrcMsg);
if ( strcmp (pszClassID, szSrcMsg) == 0)
{
printf ( "ok\n" );
}
//提取每个IP值
const char * pszIP = "192.168.45.11" ;
unsigned char ucIPAddr[4] = {};
sscanf (pszIP, "%d.%d.%d.%d" , &ucIPAddr[0],
&ucIPAddr[1],
&ucIPAddr[2],
&ucIPAddr[3]);
for ( size_t i = 0; i < 4; i++)
{
printf ( "ip element[%d] : %d\n" , i, ucIPAddr[i]);
}
|
执行结果:
1
2
3
4
5
6
7
|
name : Rudolph age: 12
src string : 1234070809001
ok
ip element[0] : 192
ip element[1] : 168
ip element[2] : 45
ip element[3] : 11
|
以上这篇c/c++ 利用sscanf进行数据拆分操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/asnsos/article/details/99936154