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)文章
深入淺析C/C++語言結(jié)構(gòu)體指針的使用注意事項(xiàng)
這篇文章主要介紹了C/C++語言結(jié)構(gòu)體指針的使用,大家都知道指針在32位系統(tǒng)占用4Byte,在64位系統(tǒng)占用8Byte,下面看下c語言代碼例子2021-12-12深入解析設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用
這篇文章主要介紹了設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用,通常適配器模式可以細(xì)分為類適配器和對象適配器兩種情況,需要的朋友可以參考下2016-03-03Qt數(shù)據(jù)庫相關(guān)應(yīng)用開發(fā)總結(jié)
這篇文章主要為大家介紹了在Qt數(shù)據(jù)庫應(yīng)用開發(fā)中的一些經(jīng)驗(yàn)總結(jié),以及一些組件的使用介紹。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-02-02C++日期類計(jì)算器的模擬實(shí)現(xiàn)舉例詳解
兩個日期之間相隔天數(shù)的計(jì)算網(wǎng)上有許多的軟件,這里主要介紹如何使用C/C++語言來完成這樣的功能,下面這篇文章主要給大家介紹了關(guān)于C++日期類計(jì)算器的模擬實(shí)現(xiàn),需要的朋友可以參考下2023-04-04