c語言 sscanf,scanf,fscanf正則表達(dá)式用法
每種語言都對(duì)正則表達(dá)式有著不同程度的支持,在C語言中,有輸入功能的這三個(gè)函數(shù)對(duì)正則表達(dá)式的支持并不強(qiáng)大,但是我們還是有必要了解一下。
首先來看看他們的原型:
#include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...);
均可以接受變參,sscanf與scanf類似,可以將標(biāo)準(zhǔn)輸入(stdin)作為輸入源。最關(guān)鍵的部分,就是format這個(gè)參數(shù)了。它可以是一個(gè)或者多個(gè) {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號(hào)}。
參數(shù)解釋:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星號(hào) (*) 表示跳過此數(shù)據(jù)不讀入. (也就是不把此數(shù)據(jù)讀入?yún)?shù)中)
2、{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。
3、width表示讀取寬度。
4、{h | l | I64 | L}:參數(shù)的size,通常h表示單字節(jié)size,I表示2字節(jié) size,L表示4字節(jié)size(double例外),l64表示8字節(jié)size。
5、type : 就是%s,%d之類。
6、特別的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會(huì)向目標(biāo)參數(shù)中寫入值
支持的集合操作:%[a-z] 表示匹配a到z中任意字符,貪婪性(盡可能多的匹配)%[aB'] 匹配a、B、'中一員,貪婪性%[^a] 匹配非a的任意字符,貪婪性
返回值
這三個(gè)函數(shù)返回成功匹配和分配的輸入項(xiàng)。意思就是你在format參數(shù)列表中的格式,返回值可以比你提供的匹配項(xiàng)目數(shù)少(有些將會(huì)匹配失?。L崆捌ヅ涫t返回0。如果達(dá)到文件末尾,則返回EOF,當(dāng)發(fā)生錯(cuò)誤的時(shí)候也將返回EOF。你可以通過輸出errno來查看錯(cuò)誤代碼。
如果使用fscanf來判斷文件是否結(jié)束,將會(huì)存在安全隱患,如果每次讀取的時(shí)候都是匹配失敗,那么返回值永遠(yuǎn)都不會(huì)是EOF。scanf族的函數(shù)都是要先將數(shù)據(jù)讀入緩沖區(qū),然后在沖緩沖里讀取。
注意:scanf族函數(shù)會(huì)忽略一行開始的空白
sscanf/scanf正則用法
%[ ] 的用法:
%[ ] 表示要讀入一個(gè)字符集合 , 如果 [ 后面第一個(gè)字符是 ”^” ,則表示反意思。
[ ] 內(nèi)的字符串可以是 1 或更多字符組成??兆址?%[] )是違反規(guī)定的,可
導(dǎo)致不可預(yù)知的結(jié)果。 %[^] 也是違反規(guī)定的。
%[a-z] 讀取在 a-z 之間的字符串,如果不在此之前則停止,如
char s[]="hello, my friend” ; // 注意 : , 逗號(hào)在不 a-z 之間 sscanf( s, “%[a-z]”, string ) ; // string=hello
%[^a-z] 讀取不在 a-z 之間的字符串,如果碰到 a-z 之間的字符則停止,如
char s[]="HELLOkitty” ;// 注意 : , 逗號(hào)在不 a-z 之間 sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
%*[^=] 前面帶 * 號(hào)表示不保存變量。跳過符合條件的字符串。
char s[]="notepad=1.0.0.1001" ; char szfilename [32] = "" ; int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL, 因?yàn)闆]保存 int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001
%40c 讀取 40 個(gè)字符
The run-time
library does not automatically append a null terminator to the string, nor does reading 40 characters
automatically terminate the scanf() function. Because the library uses buffered input, you must press the ENTER key to terminate the string scan. If you press the ENTER before the scanf() reads 40 characters, it is displayed normally, and the library continues to prompt for additional input until it reads 40 characters
%[^=] 讀取字符串直到碰到 '=' 號(hào), '^' 后面可以帶更多字符 , 如:
char s[]="notepad=1.0.0.1001" ; char szfilename [32] = "" ; int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad
如果參數(shù)格式是: %[^=:] ,那么也可以從 notepad:1.0.0.1001 讀取 notepad
使用例子:
char s[]="notepad=1.0.0.1001" ; char szname [32] = "" ; char szver [32] = “” ; sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001
總結(jié): %[] 有很大的功能,但是并不是很常用到,主要因?yàn)椋?/p>
1 、許多系統(tǒng)的 scanf 函數(shù)都有漏洞 . ( 典型的就是 TC 在輸入浮點(diǎn)型時(shí)有時(shí)會(huì)出錯(cuò) ).
2 、用法復(fù)雜 , 容易出錯(cuò) .
3 、編譯器作語法分析時(shí)會(huì)很困難 , 從而影響目標(biāo)代碼的質(zhì)量和執(zhí)行效率 .
個(gè)人覺得第 3 點(diǎn)最致命,越復(fù)雜的功能往往執(zhí)行效率越低下。而一些簡(jiǎn)單的字符串分析我們可以自已處理。
C語言中scanf(),sscanf(),fscanf()的用法和區(qū)別
scanf(),sscanf(),fscanf()區(qū)別:
第一個(gè)是從控制臺(tái)(鍵盤)輸入;
第二個(gè)是從字符串輸入;
第三個(gè)是從文件輸入;
scanf
scanf()函數(shù)根據(jù)由format(格式)指定的格式從stdin(標(biāo)準(zhǔn)輸入)讀取,并保存數(shù)據(jù)到其它參數(shù).
int main() { int a,b,c; printf("輸入:a,b,c\n"); scanf("%d,%d,%d",&a,&b,&c); printf("a = %d b = %d c = %d",a,b,c); return 0; }
sscanf
函數(shù)sscanf()和scanf()類似, 只是輸入從buffer(緩沖區(qū))中讀取.
sscanf與scanf類似,都是用于輸入的,只是后者以屏幕(stdin)為輸入源,前者以固定字符串為輸入源
用法:
%[ ]表示要讀入一個(gè)字符集合, 如果[ 后面第一個(gè)字符是”^”,則表示反意思。[ ]內(nèi)的字符串可以是1或更多字符組成??兆址?[])是違反規(guī)定的,可導(dǎo)致不可預(yù)知的結(jié)果。%[^]也是違反規(guī)定的。
1. 常見用法。
char buf[512] ;
sscanf("123456 ", "%s", buf);//此處buf是數(shù)組名,它的意思是將123456以%s的形式存入buf中!
printf("%s\n", buf);
結(jié)果為:123456
2. 取指定長度的字符串。如在下例中,取最大長度為4字節(jié)的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
結(jié)果為:1234
3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結(jié)果為:123456
4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
結(jié)果為:123456abcdedf
當(dāng)輸入: sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%s\n",buf);
結(jié)果為:123456
5. 取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
結(jié)果為:123456abcdedf
6、給定一個(gè)字符串iios/12DDWDFF@122,獲取 / 和 @ 之間的字符串,
先將 "iios/"過濾掉,再將非'@'的一串內(nèi)容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結(jié)果為:12DDWDFF
7、給定一個(gè)字符串“hello, world”,僅保留world。
(注意:“,”之后有一空格,%s遇空格停止,加*則是忽略第一個(gè)讀到的字符串)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
結(jié)果為:world
%*s表示第一個(gè)匹配到的%s被過濾掉,即“hello,”被過濾了
如果沒有空格則結(jié)果為NULL。
上一篇:OpenCV cv.Mat與.txt文件數(shù)據(jù)的讀寫操作
欄 目:C語言
本文標(biāo)題:c語言 sscanf,scanf,fscanf正則表達(dá)式用法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/819.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子