欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作

 更新時間:2020年12月10日 09:48:41   作者:冬暖海洋  
這篇文章主要介紹了c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

sscanf使用示例

示例:使用sscanf分割文件中的數(shù)據(jù),數(shù)據(jù)源示例如下

川EZ1E58,貴GQ7708,:1302

貴AE0996,:185

貴A0PJ06,貴JYN192,貴JYN192,:128

分割代碼如下所示:

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

補(bǔ)充知識:sscanf從字符串中按照指定格式提取數(shù)據(jù)

我們在學(xué)習(xí)C語言的時候,一定都使用過scanf函數(shù),它表示從標(biāo)準(zhǔn)輸入中按照指定格式接收數(shù)據(jù)到變量。實(shí)際編程中,我們常常希望能從字符串中,提取想要的數(shù)據(jù)時,此時我們就可以派上sscanf函數(shù)了.

sscanf

sscanf 函數(shù)聲明如下:

int sscanf( const char* str, const char* format, ... );

它表示從字符串str中按照format格式提取數(shù)據(jù)到指定變量中。

sprintf

常常和sscanf配合使用的是sprintf函數(shù),其函數(shù)聲明如下:

int sprintf(char *buffer, const char *format, ...);

它表示提取變量中的數(shù)據(jù)按照指定格式組裝成一個字符串。

用例

//提取姓名和年齡
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);
//將字符串進(jìn)行每兩位進(jìn)行分割,最后一位分割為是一位數(shù).
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]);
//還原為字符串,不足兩位左邊補(bǔ)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]);
}

執(zhí)行結(jié)果:

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進(jìn)行數(shù)據(jù)拆分操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論