c/c++ 利用sscanf进行数据拆分操作

时间:2022-11-18 16:11:20

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