c/c+++sscanfを利用してデータの分割操作を行う。
sscanf使用例
例:sscanfを用いてファイル中のデータを分割し、データソースの例は以下の通りである。
川EZ 1 E 58、貴GQ 7708、:1302
貴AE 0909、:185
貴A 0 PJ 06、貴JYN 192、貴JYN 192、128
分割コードは以下の通りです。
私たちはC言語を勉強する時、きっとscanf関数を使ったことがあります。標準入力から指定された形式でデータを変数に受信することを表しています。実際のプログラミングでは、文字列から希望のデータを抽出することができます。
int sscanf(const char*str、const char*format);
文字列strからformat形式でデータを指定変数に抽出することを表します。
int sprintf(char*buffer、const char*format);
抽出変数のデータが指定されたフォーマットに従って文字列に組み立てられていることを示します。
用例
例:sscanfを用いてファイル中のデータを分割し、データソースの例は以下の通りである。
川EZ 1 E 58、貴GQ 7708、:1302
貴AE 0909、:185
貴A 0 PJ 06、貴JYN 192、貴JYN 192、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
",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("
");
printf("%s
",StrLine);
int ret = DealLine(StrLine);
}
fclose(fp);
return 0;
}
補足知識:文字列から指定された形式でデータを抽出する。私たちはC言語を勉強する時、きっとscanf関数を使ったことがあります。標準入力から指定された形式でデータを変数に受信することを表しています。実際のプログラミングでは、文字列から希望のデータを抽出することができます。
sscanf
sscanf関数の声明は以下の通りである。int sscanf(const char*str、const char*format);
文字列strからformat形式でデータを指定変数に抽出することを表します。
sprintf
頻繁にsscanfと協力して使用するのはsprintf関数で、その関数は以下の通りである。int sprintf(char*buffer、const char*format);
抽出変数のデータが指定されたフォーマットに従って文字列に組み立てられていることを示します。
用例
//
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
", 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
", szSrcMsg);
if (strcmp(pszClassID, szSrcMsg) == 0)
{
printf("ok
");
}
// 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
", i, ucIPAddr[i]);
}
実行結果:
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を利用してデータを分割して操作します。つまり、小編集は皆さんに全部の内容を共有しています。みなさんに参考にしてもらいたいです。どうぞよろしくお願いします。