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ǔ)充知識(shí):sscanf從字符串中按照指定格式提取數(shù)據(jù)
我們?cè)趯W(xué)習(xí)C語言的時(shí)候,一定都使用過scanf函數(shù),它表示從標(biāo)準(zhǔn)輸入中按照指定格式接收數(shù)據(jù)到變量。實(shí)際編程中,我們常常希望能從字符串中,提取想要的數(shù)據(jù)時(shí),此時(shí)我們就可以派上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ù)按照指定格式組裝成一個(gè)字符串。
用例
//提取姓名和年齡
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ī)晌贿M(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");
}
//提取每個(gè)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ù)拆分操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用MySQL編程實(shí)現(xiàn)C語言功能強(qiáng)大化步驟示例
這篇文章主要為大家介紹了使用MySQL編程實(shí)現(xiàn)C語言功能強(qiáng)大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
C語言每日練習(xí)之統(tǒng)計(jì)文本單詞數(shù)及高頻詞
本文文大家準(zhǔn)備了個(gè)C語言練習(xí)題:統(tǒng)計(jì)單詞數(shù)并找出頻率最高的單詞,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語言有一定幫助,感興趣的可以了解一下2022-05-05
C++中對(duì)C語言結(jié)構(gòu)體用法的擴(kuò)充
今天小編就為大家分享一篇關(guān)于C++中對(duì)C語言結(jié)構(gòu)體用法的擴(kuò)充,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
Qt采用線程以隊(duì)列方式實(shí)現(xiàn)下發(fā)數(shù)據(jù)
在C++中隊(duì)列是一種常用的數(shù)據(jù)結(jié)構(gòu)之一,一種特殊的線性表,一般采用先進(jìn)先出的方式。本文主要為大家介紹了Qt如何以隊(duì)列方式實(shí)現(xiàn)下發(fā)數(shù)據(jù),感興趣的可以了解一下2022-10-10
深入理解goto語句的替代實(shí)現(xiàn)方式分析
本篇文章是對(duì)goto語句的替代實(shí)現(xiàn)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++:構(gòu)造函數(shù),析構(gòu)函數(shù)詳解
今天小編就為大家分享一篇關(guān)于C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2021-09-09

