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