天天看點

sscanf函數使用詳解一、描述二、示例用法

一、描述

sscanf通常被用來解析并轉換字元串,其格式定義靈活多變,可以實作很強大的字元串解析功能。

sscanf的原型

#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
           

str:待解析的字元串;

format:字元串格式描述;

其後是一序列數目不定的指針參數,存儲解析後的資料.

二、示例用法

1. sscanf的基本用法

整形數轉換

int year, month, day;

int converted = sscanf("20191103", "%04d%02d%02d", &year, &month, &day);
printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);
           

輸出結果:

converted=3, year=2019, month=11, day=03
           

"%04d%02d%02d"是用來解析字元串的格式,%表示格式轉換的開始,d表示轉換為一個整數,04作為d的修飾,表示這是一個長度為4位的整數,不足4位時以0補齊。

例子傳回結果等于3,表示有3個資料成功轉換,轉換成功數目同時取決于被解析的字元串以及其轉換格式,如果我們把例子中的格式改為"%04d%02d",那麼sscanf将隻傳回2,day的數值不會被sscanf更改。

浮點數轉換

double longitude, latitude;
int converted = sscanf("113.123456789 31.123456789", "%lf %lf", &longitude, &latitude);
printf("converted=%d, longitude=%.9lf, latitude=%lf/n", converted, longitude, latitude);
           

輸出結果:

converted=2, longitude=113.123456789, latitude=31.123457
           

sscanf的格式字元串中,f表示這是一個浮點數,其修飾詞l表示這是一個double的浮點數。

2. sscanf的進階用法

數字+字元串

char str[32] = "";
sscanf("123456abcdedf", "%31[0-9]", str);
printf("str=%s/n", str);
           

輸出結果:

str=123456
           

上面的格式中,[0-9]表示這是一個僅包含0-9這幾個字元的字元串,前面使用數字31修飾詞表示這個字元串緩沖區的最大長度(這也是sscanf最為人诟病的地方,很容易出現緩沖區溢出錯誤,實際上sscanf是可以避免出現緩沖區溢出的,隻要在書寫任何字元串解析的格式時,注意加上其緩沖區尺寸的限制)。

char str[32] = "";
sscanf("123456abcdedf", "%31[0-9a-z]", str);
printf("str=%s/n", str);
           

輸出結果:

str=123456abcdedf
           

在格式[]中增加了a-z的描述。

使用^示例:

char str[32] = "";
sscanf("123456abcdedf", "%31[^a-z]", str);
printf("str=%s/n", str);
           

輸出結果:

str=123456
           

在[]中增加表示相反的意思,上面的[a-z]表示一個不包含任何a-z之間的字元串。

使用*的例子:

char str[32] = "";
int ret = sscanf("123456abcdedf", "%*[0-9]%31[a-z]", str);
printf("ret=%d, str=%s/n",ret, str);
           

輸出結果:

ret=1, str=abcdedf
           

加上*修飾表示一個被忽略的資料,同時也不需要為它準備空間存放解析結果。如上面的例子中,我們就隻使用了str一個參數存放%31[a-z]的解析結果,而sscanf也隻傳回1,表示隻解析了一個資料。

掌握了[], ^, *如何使用後,我們會發現sscanf原來是一個如此強大的工具,很多我們原先認為必須使用正規表達式的地方,很可能使用sscanf就可以實作。

繼續閱讀