最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c語言 sscanf,scanf,fscanf正則表達式用法

 更新時間:2018年04月19日 16:22:13   投稿:mdxy-dxy  
每種語言都對正則表達式有著不同程度的支持,在C語言中,有輸入功能的這三個函數(shù)對正則表達式的支持并不強大,但是我們還是有必要了解一下

每種語言都對正則表達式有著不同程度的支持,在C語言中,有輸入功能的這三個函數(shù)對正則表達式的支持并不強大,但是我們還是有必要了解一下。

首先來看看他們的原型:

#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類似,可以將標準輸入(stdin)作為輸入源。最關(guān)鍵的部分,就是format這個參數(shù)了。它可以是一個或者多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號}。

參數(shù)解釋:

  1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數(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 表示滿足該條件的被過濾掉,不會向目標參數(shù)中寫入值

支持的集合操作:%[a-z] 表示匹配a到z中任意字符,貪婪性(盡可能多的匹配)%[aB'] 匹配a、B、'中一員,貪婪性%[^a] 匹配非a的任意字符,貪婪性

返回值

這三個函數(shù)返回成功匹配和分配的輸入項。意思就是你在format參數(shù)列表中的格式,返回值可以比你提供的匹配項目數(shù)少(有些將會匹配失敗)。提前匹配失敗則返回0。如果達到文件末尾,則返回EOF,當發(fā)生錯誤的時候也將返回EOF。你可以通過輸出errno來查看錯誤代碼。

如果使用fscanf來判斷文件是否結(jié)束,將會存在安全隱患,如果每次讀取的時候都是匹配失敗,那么返回值永遠都不會是EOF。scanf族的函數(shù)都是要先將數(shù)據(jù)讀入緩沖區(qū),然后在沖緩沖里讀取。

注意:scanf族函數(shù)會忽略一行開始的空白

sscanf/scanf正則用法

%[ ] 的用法:

 %[ ] 表示要讀入一個字符集合 , 如果 [ 后面第一個字符是 ”^” ,則表示反意思。

[ ] 內(nèi)的字符串可以是 1 或更多字符組成。空字符集( %[] )是違反規(guī)定的,可

導致不可預知的結(jié)果。 %[^] 也是違反規(guī)定的。

%[a-z] 讀取在 a-z 之間的字符串,如果不在此之前則停止,如

char s[]="hello, my friend” ; // 注意 : , 逗號在不 a-z 之間
sscanf( s, “%[a-z]”, string ) ; // string=hello

%[^a-z] 讀取不在 a-z 之間的字符串,如果碰到 a-z 之間的字符則停止,如

char s[]="HELLOkitty” ;// 注意 : , 逗號在不 a-z 之間
sscanf( s, “%[^a-z]”, string ) ; // string=HELLO

%*[^=] 前面帶 * 號表示不保存變量。跳過符合條件的字符串。

char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL, 因為沒保存
int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001

%40c 讀取 40 個字符

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

%[^=] 讀取字符串直到碰到 '=' 號, '^' 后面可以帶更多字符 , 如:

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é): %[] 有很大的功能,但是并不是很常用到,主要因為:

1 、許多系統(tǒng)的 scanf 函數(shù)都有漏洞 . ( 典型的就是 TC 在輸入浮點型時有時會出錯 ).
2 、用法復雜 , 容易出錯 .
3 、編譯器作語法分析時會很困難 , 從而影響目標代碼的質(zhì)量和執(zhí)行效率 .

個人覺得第 3 點最致命,越復雜的功能往往執(zhí)行效率越低下。而一些簡單的字符串分析我們可以自已處理。

C語言中scanf(),sscanf(),fscanf()的用法和區(qū)別

scanf(),sscanf(),fscanf()區(qū)別:
第一個是從控制臺(鍵盤)輸入;
第二個是從字符串輸入;
第三個是從文件輸入;
scanf
scanf()函數(shù)根據(jù)由format(格式)指定的格式從stdin(標準輸入)讀取,并保存數(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)為輸入源,前者以固定字符串為輸入源

用法:
%[ ]表示要讀入一個字符集合, 如果[ 后面第一個字符是”^”,則表示反意思。[ ]內(nèi)的字符串可以是1或更多字符組成??兆址?[])是違反規(guī)定的,可導致不可預知的結(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
當輸入: 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、給定一個字符串iios/12DDWDFF@122,獲取 / 和 @ 之間的字符串,

先將 "iios/"過濾掉,再將非'@'的一串內(nèi)容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結(jié)果為:12DDWDFF

7、給定一個字符串“hello, world”,僅保留world。

(注意:“,”之后有一空格,%s遇空格停止,加*則是忽略第一個讀到的字符串)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
結(jié)果為:world
%*s表示第一個匹配到的%s被過濾掉,即“hello,”被過濾了
如果沒有空格則結(jié)果為NULL。

相關(guān)文章

  • c/c++ 利用sscanf進行數(shù)據(jù)拆分操作

    c/c++ 利用sscanf進行數(shù)據(jù)拆分操作

    這篇文章主要介紹了c/c++ 利用sscanf進行數(shù)據(jù)拆分操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++實現(xiàn)LeetCode(124.求二叉樹的最大路徑和)

    C++實現(xiàn)LeetCode(124.求二叉樹的最大路徑和)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(124.求二叉樹的最大路徑和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++中關(guān)鍵字const的詳細說明和使用介紹(最全)

    C++中關(guān)鍵字const的詳細說明和使用介紹(最全)

    const在C/C++中是十分重要的,如果單純理解為“常量”那么你的格局就小了,今天在這里給大家介紹一下const在C++中具體詳細的用法,需要的朋友可以參考下
    2025-03-03
  • C++游戲編程之模擬實現(xiàn)鍵盤打字程序

    C++游戲編程之模擬實現(xiàn)鍵盤打字程序

    這篇文章主要介紹了通過C++模擬實現(xiàn)鍵盤打字的功能,文中的示例代碼講解詳細,對我們學習C++有一定的幫助,感興趣的小伙伴可以學習一下
    2021-12-12
  • C#桌面應(yīng)用開發(fā)實現(xiàn)番茄定時器

    C#桌面應(yīng)用開發(fā)實現(xiàn)番茄定時器

    本文主要介紹了C#桌面應(yīng)用開發(fā)實現(xiàn)番茄定時器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • C++?多線程之互斥量(mutex)詳解

    C++?多線程之互斥量(mutex)詳解

    這篇文章主要為大家詳細介紹了C++多線程之互斥量(mutex),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • VC++編程獲取窗口句柄的方法小結(jié)

    VC++編程獲取窗口句柄的方法小結(jié)

    這篇文章主要介紹了VC++編程獲取窗口句柄的方法,簡單總結(jié)分析了VC++獲取窗口句柄的常見函數(shù)與使用技巧,需要的朋友可以參考下
    2017-07-07
  • C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題詳解

    C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題詳解

    c++?vector轉(zhuǎn)數(shù)組是一種將vector容器的元素轉(zhuǎn)換為數(shù)組的方法,主要能幫助提高程序的性能和效率,下面這篇文章主要給大家介紹了關(guān)于C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • C語言折半查找法介紹及使用示例

    C語言折半查找法介紹及使用示例

    折半查找法也叫做?分查找,顧名思義就是把數(shù)據(jù)分成兩半,再判斷所查找的key在哪?半中,再重復上述步驟知道找到?標key,下面這篇文章主要給大家介紹了關(guān)于C語言折半查找法的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • C++元編程語言初步入門詳解

    C++元編程語言初步入門詳解

    這篇文章主要為大家介紹了C++元編程語言初步入門的詳解示例,文中包含詳細的基本概念及運用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評論

张北县| 酉阳| 黄平县| 易门县| 长顺县| 荣昌县| 淄博市| 富锦市| 定西市| 岑溪市| 武定县| 太仓市| 信丰县| 印江| 龙井市| 馆陶县| 绥化市| 孟州市| 清新县| 年辖:市辖区| 河南省| 阳春市| 当阳市| 东辽县| 松桃| 德令哈市| 山东| 大姚县| 巧家县| 周口市| 鹤壁市| 辽宁省| 汝城县| 西平县| 津南区| 云安县| 农安县| 福贡县| 明星| 宿迁市| 三穗县|