天天看點

003-字元串的格式化提取,配合sscanf的使用

1.函數的說明: 函數簡介:sscanf ( 格式化字元串輸入 ) 相關函數:scanf,fscanf 頭 文 件 :#include<stdio.h> 函數定義: int sscanf(const char *str,const char * format, ......); 函數功能: 從str指定的字元串讀取資料,并根據format字元串來轉換并格式化資料。 函數參數:                 str:指定字元串的首位址                 format:字元串格式,用法和scanf()一樣。 傳回值:                 成功則傳回參數數目                 失敗則傳回-1                 錯誤原因存于errno中。

2.固定格式提取内容的案例

/***********************************************
函數名稱:sscanf固定方式資料提取
功    能:提取固定格式的坐标資料
入口參數:無
返 回 值:無
編 譯 器:VS2015-控制台程式
備    注:無
************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
       char src[100] = { 0 };
       //固定格式的内容提取
       int x = 100, y = 120, z = 300;                                       //假設有一個點,需要通過這三個坐标來定位。
       sprintf(src, "X = %d,Y = %d,Z = %d\n", x, y, z);       //使用格式化組包功能,将三個坐标組合後寫入字元串中
       printf("組包後的字元串:%s",src);                              //列印組合後的字元串(組包)。
       int tmp_x, tmp_y, tmp_z;                                             //準備提取資料的臨時變量
       sscanf(src, "X = %d,Y = %d,Z = %d", &tmp_x, &tmp_y, &tmp_z);  //按照組包時的格式,提取相應的資料。
       printf("提取到的資料:tmp_x = %d,tmp_y = %d,tmp_z = %d\n",tmp_x,tmp_y,tmp_z);  //列印提取的資料。
       printf("\n");
       system("pause");
       return 0;
}
           
003-字元串的格式化提取,配合sscanf的使用

3.格式化輸入

格式化字元如下:

%*s 或 %*d 跳過資料(s 字元串,d整數)
%[width]s 讀指定寬度的資料
%[a-z] 比對 a 到 z 中任意字元 ( 盡可能多的比對 )
%[aBc] 比對 a 、 B 、 c 中一員,貪婪性
%[^a] 比對非 a 的任意字元,貪婪性
%[^a-z] 表示讀取除 a-z 以外的所有字元
/***********************************************
函數名稱:sscanf格式化過濾方式資料提取
功    能:在固定的字元串中随意提取資料。
入口參數:無
返 回 值:無
編 譯 器:VS2015 - 控制台程式
備    注:無
************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
       int tmp_x, tmp_y, tmp_z;                 //準備提取資料的臨時變量
       char src[100] = "yongheng0852! X=30,Y=20,Z=100";
       char dst[100] = { 0 };
       char s1[100], s2[100], s3[100];
       printf("src = %s\n", src); //列印組合後的字元串(組包)。
       //1:%*s或%*d  跳過資料:提取第一個空格後面的字元串,也就是X=30,Y=20,Z=100
       memset(dst, 0, sizeof(dst));
       sscanf(src, "%*s %s", dst);//%*s ,跳過第一段字元和空格,讀取後面的字元。
       printf("1:dst = [%s]\n",dst);
       //2:%[width]s 讀指定寬度的資料,讀取前13個字元
       memset(dst, 0, sizeof(dst));
       sscanf(src, "%13s", dst);  //讀取src字元串的前13個字元。
       printf("2:dst = [%s]\n", dst);
       //3:%[a-z]    比對a到z中任意字元(盡可能多的比對)
       memset(dst, 0, sizeof(dst));
       sscanf(src, "%[a-z]", dst);//從字元串的首位址開始搜尋,當元素為[a-z]是,提取,遇到元素非[a-z]時停止
       printf("3:dst = [%s]\n", dst);
       //4:%[0-9]    比對0到9中任意字元(盡可能多的比對)
       memset(dst, 0, sizeof(dst));
       sscanf(src, "%[0-9]", dst);//從字元串的首位址開始搜尋,當元素為[0-9]是,提取,遇到元素非[0-9]時停止
       printf("4:dst = [%s]\n", dst);
       //5:跳過a-z,取後面的0-9
       memset(dst, 0, sizeof(dst));
       sscanf(src, "%*[a-z]%[0-9]", dst);
       printf("5:dst = [%s]\n", dst);
       //6:分别提取x,y,z的字元串,先跳過空格前面的字元串,讀取字元,直到遇到逗号,在跳過逗号,提取第二個端内容,再跳過逗号,提取第三段内容
       memset(dst, 0, sizeof(dst));
       sscanf(src, "%*s %[^,],%[^,],%[^,]",s1,s2,s3);
       printf("6: s1 = [%s],s2 = [%s],s3 = [%s]\n",s1,s2,s3);
       //7:提取感歎号,跳過,感歎号以前的字元,在讀取字元,遇到感歎号的下一個字元為止。
       memset(dst, 0, sizeof(dst));
       sscanf(src, "%*[^!]%s[^ ]",dst);
       printf("7: dst = [%s]\n", dst);
       printf("\n");
       system("pause");
       return 0;
}
           
003-字元串的格式化提取,配合sscanf的使用

注意:         1.第四項沒有内容:是因為我們提取取值為[0-9],而字元串開始位置就是非數字内容,是以,搜尋當比較到第0個元素,不符合則終止比較,是以dst為初始化時的字元。         2.這種方法來提起資料,因為沒有任何規律,是以不能使用循環來提取。必要時可以使用切割字元串的方式。

繼續閱讀