1. 程式人生 > >函式 —— scanf() fscanf() sscanf() (分析sscanf正則表示式的用法)

函式 —— scanf() fscanf() sscanf() (分析sscanf正則表示式的用法)

       int scanf(const char *format, ...);
       int fscanf(FILE *stream, const char *format, ...);

       int sscanf(const char *str, const char *format, ...);

************************************scanf************************************

*****************************************************************************

int scanf(constchar*format,...)
/*功能:從標準輸入 stdin 讀取格式化輸入
 * */
/*引數:format -- 這是 C 字串,包含了以下各項中的一個或多個>:空格字元、非空格字元 和 format 說明符。
 * format 說明符形式為 [=%[*][width][modifiers]type=],
 * */
/*返回值:如果成功,該函式返回成功匹配和賦值的個數。如果到達文>件末尾或發生讀錯誤,則返回 EOF

 * */

#include <stdio.h>

int main()
{
   char str1[20], str2[30];

   printf("請輸入使用者名稱:");
   scanf("%s", str1);


   printf("輸入的使用者名稱:%s\n", str1);

   return(0);
}

************************************fscanf*********************************************

***************************************************************************************

int fscanf(FILE *stream,constchar*format,...)
/*功能:從流 stream 讀取格式化輸入
 * */
/*引數:
 * stream -- 這是指向 FILE 物件的指標,該 FILE 物件標識了流。
 * format -- 這是 C 字串,包含了以下各項中的一個或多個:空格
字元、非空格字元 和 format 說明符。format 說明符形式為 [=%[*][width][modifiers]type=],
 * */
/*返回值:
 * 如果成功,該函式返回成功匹配和賦值的個數。如果到達檔案末尾>或發生讀錯誤,則返回 EOF
 * */
/*fgets()與fscanf()的區別:
 * 前者遇到空格不結束,遇到換行會結束;後者遇到空格、換行都會>結束*/
#include<stdio.h>#include<stdlib.h>int main(){  
char str1[10],str2[10],str3[10];   FILE *fp;   fp = fopen("file.txt","r");   fscanf(fp,"%s %s %s",str1,str2,str3);   printf("%s \n %s \n %s \n",str1,str2,str3);   fclose(fp);   return 0;}

************************************sscanf*********************************************

***************************************************************************************

int sscanf(constchar*str,constchar*format,...)
/*功能:
 *是c語言中從一個字串中讀進與指定格式相符的資料的函式。其是>以固定字串為源輸入*/
/*引數:
 *str -- 這是 C 字串,是函式檢索資料的源。
 *format -- 這是 C 字串,包含了以下各項中的一個或多個:空格>字元、非空格字元 和 format 說明符。format 說明符形式為 [=%[*][width][modifiers]type=], */
/*返回值:
 * 如果成功,該函式返回成功匹配和賦值的個數。如果到達檔案末尾>或發生讀錯誤,則返回 EOF。例如:sscanf(str,"%d%d%s", &i,&i2, &s);    如果三個變成都讀入成功會返回3。    如果只讀入了第一個整數到i則會返回1。證明無法從str讀入第二個整數*/

首先來了解一下sscanf()函式的常見用法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
        int day, year;
        char weekday[20], month[20], dtm[100];
        char len4[20],speciChara[20],speciChara1[20],contChara[20];
        char clipChara[20],speciChara3[20];
        strcpy( dtm, "Saturday March 25 1989" );
        printf("原來的字串為:*%s*\n",dtm);
        //常見用法
        sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );
        printf("常見用法:%s %d, %d = %s\n", month, day, year, weekday );
        return(0);
}

接下來,來了解一下sscanf()函式的正則表示式用法:

//在繼續討論之前,我們先來看看百分號表示什麼意思,%表示選擇,%後面的是條件,比如常見用法中的"%s",s是一個條件,表示任意字元,"%s"的意思是:只要輸入的東西是一個字元,就把它拷貝給str。情況1的"%4s"又多了一個條件:只拷貝4個字元。情況2的“%[a-z]”的條件稍微嚴格一些,輸入的東西不但是字元,還得是一個小寫字母的字元,所以實驗3只拷貝了小寫字母"aaa"給len。

   (情況1-4給出的 字串是:strcpy( dtm, "Saturday March 25 1989" );)

情況1:取指定長度字串,取最大長度為4位元組的字串

sscanf( dtm, "%4s", len4);
printf("取4位元組:*%s*\n",len4);//--->>取4位元組:*Satu*

情況2:取到指定字元為止的字串。遇到空格為止的字串

    sscanf( "aaaAAA", "%[a-z]", len);
    printf("取指定字元:*%s*\n",len);//--->>取指定字元:*aaa*
    sscanf( dtm, "%*[^ ] %[A-Z ]", speciChara);
    printf("取到指定字元(空格):*%s*\n",speciChara);//--->>取到指定字元(空格):*M*
    sscanf( dtm, "%[^d-z]", speciChara);
    printf("取到指定字元(遇到小寫字母為止):*%s*\n\n",speciChara);//--->>取到指定字元(遇到小寫字母為止):*Sa*

情況3:給定一個字串,僅保留某些字元

   sscanf( dtm, "%*s%s", speciChara3);
   printf("僅保留某些字元:*%s*\n\n",speciChara3);//--->>僅保留某些字元:*March*

  (情況4給出的 字串是:sscanf( "iios/[email protected]", "%*[^/]/%[^@]", clipChara);) 

情況4:給定一個字串iios/[email protected],獲取 / 和 @ 之間的字串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中

printf("此時的字串為:iios/[email protected]\n");
sscanf( "iios/[email protected]", "%*[^/]/%[^@]", clipChara);
printf("取到指定字元(空格):*%s*\n\n",clipChara);//--->>取到指定字元(空格):*12DDWDFF*
 (情況5給出的 字串是:sscanf("Aaturday March 25 1989", "%[1-9a-z]", contChara);)  

情況5:取僅包含指定字符集的字串。取僅包含1-9和小寫字母的字串

printf("此時的字串為:aturday March 25 1989\n");
sscanf("Aaturday March 25 1989", "%[1-9a-z]", contChara);
printf("僅取包含指定字符集(0-9z-a):%s\n",contChara);
printf("當首字母不能被匹配時候沒有結果!!!\n");

情況6:當字串前後有空格時候,取指定字元的方法。

        sscanf("         Aaturday March ", "%*[ \t]%[^ ] %[^ ]", str,str1);
//第一個格式是隻讀空格 \t,並忽略掉,並且不再匹配空格; 第二個格式是不匹配空格
        printf("首尾有空格,正則,只取Aaturday(過濾掉第一個空格/tab):*%s*\n",str);
        printf("首尾有空格,正則,只取Aaturday(過濾掉第一個空格/tab):*%s*\n",str1);
        sscanf("         Aaturday March ", "%s %s", str,str1);
        printf("首尾有空格,只取Aaturday(過濾掉第一個空格/tab):*%s*\n",str);
        printf("首尾有空格,只取Aaturday(過濾掉第一個空格/tab):*%s*\n",str1);
        sscanf(" Aaturday March ", "%*[ ]%[ ]", str,str1);
        printf("首尾有空格,只取March(過濾掉首尾空格):*%s*\n",str1);

情況7:分割字串

        char sztime1[16] = "", sztime2[16] = "";
        sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
        printf("%s %s\n",sztime1,sztime2); //--->>2006:03:18 2006:04:18
        char sztime21[16] = "", sztime22[16] = "";
        sscanf("2006:03:18-2006:04:18", "%[0-9,:] - %[0-9,:]", sztime21, sztime22);
        printf("%s %s\n",sztime21,sztime22); //--->>2006:03:18 2006:04:18

最後總結一下:

       注意1、   附加引數 -- 這個函式接受一系列的指標作為附加引數,每一個指標都指向一個物件,物件型別由 format 字串中相應的 % 標籤指定,引數與 % 標籤的順序相同針對檢索資料的 format 字串中的每個 format 說明符,應指定一個附加引數。如果您想要把 sscanf 操作的結果儲存在一個普通的變數中,您應該在識別符號前放置引用運算子(&),例如:

int n;
    sscanf (str,"%d",&amp;n);

注意2、sscanf的功能很類似於正則表示式, 但卻沒有正則表示式強大,所以如果對於比較複雜的字串處理,建議使用正則表示式.

“*”  0次或者多次

“+”  1次或者多次

“?”  0次或者1次

“{n}”    匹配n次,n為整數

“{n,m}”  匹配從n到m之間的某個數的次數;n和m都是整數;

“{n,}”   匹配n到無窮次之間任意次數;

“{,m}”   匹配0到m之間任意次數;

數量限定符號放到匹配格式的後面,例如:電話號碼:024-84820482,02484820482(假設前面3或者4位,後面7或者8位,並且中間的減號可有可無),都是符合規定的,那麼可以用如下格式來匹配:[0-9]{3,4} \-? [0-9]{7,8};注意:“\”為轉義字元,因為“-”在正則表示式用有代表一個範圍的意義,例如:前面所說的[0-9],所以它需要轉義字元“\”進行轉義才可使用;

4、^為否符號,表示不想匹配的符號,例如:[^z][a-z]+可以匹配所有除"z"開頭的以外的所有字

如果^放到[]的外邊則表示以[]開頭的字串;^[az][a-z]+表示a或者z開頭的長度大於等於2的英文字串;

5、“|”或運算子,例如:a[n|bc|cb]c可以匹配“abcc”,“anc”,“acbc”;

6、“$”以它前面的字元結尾的;例如:ab+$就可以被“abb”,“ab”匹配;

7、一些簡單表示方法:\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],就是空格字元包括tab,空格等等;\S表示[^\t\n\r\f],就是非空格字元;

完整程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
        int day, year;
        char weekday[20], month[20], dtm[100];
        char len[10],len4[20],speciChara[20],speciChara1[20],contChara[20];
        char clipChara[20],speciChara3[20];
        char str[30],str1[30],str2[30];
        printf("************************************************\n");
        printf("字串首位沒有空格 或者 tab\n");
        printf("************************************************\n");
        printf("字串首位沒有空格 tab\n");
        strcpy( dtm, "Saturday March 25 1989" );
        printf("原來的字串為:*%s*\n",dtm);
        //常見用法
        sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );
        printf("常見用法:%s %d, %d = %s\n", month, day, year, weekday );
        //取指定長度字串,取最大長度為4位元組的字串
        sscanf( dtm, "%4s", len4);
        printf("取4位元組:*%s*\n",len4);
        //取到指定字元為止的字串。遇到空格為止的字串
        sscanf( "aaaAAA", "%[a-z]", len);
        printf("取指定字元:*%s*\n",len);
        sscanf( dtm, "%*[^ ] %[A-Z ]", speciChara);
        printf("取到指定字元(空格):*%s*\n",speciChara);
        sscanf( dtm, "%[^d-z]", speciChara);
        printf("取到指定字元(遇到小寫字母為止):*%s*\n\n",speciChara);
        //給定一個字串,僅保留某些字元
        sscanf( dtm, "%*s%s", speciChara3);
        printf("僅保留某些字元:*%s*\n\n",speciChara3);
        printf("此時的字串為:iios/[email protected]\n");
        sscanf( "iios/[email protected]", "%*[^/]/%[^@]", clipChara);
        printf("取到指定字元(空格):*%s*\n\n",clipChara);
        //取僅包含指定字符集的字串。取僅包含1-9和小寫字母的字串
        printf("此時的字串為:aturday March 25 1989\n");
        sscanf("Aaturday March 25 1989", "%[1-9a-z]", contChara);
        printf("僅取包含指定字符集(0-9z-a):%s\n",contChara);
        printf("當首字母不能被匹配時候沒有結果!!!\n\n");
        //當字串首尾都有空格時候,取指定字元的方法
        sscanf("         Aaturday March ", "%*[ \t]%[^ ] %[^ ]", str,str1);
        printf("首尾有空格,正則,只取Aaturday(過濾掉第一個空格/tab):*%s*\n",str);
        printf("首尾有空格,正則,只取Aaturday(過濾掉第一個空格/tab):*%s*\n",str1);
        sscanf("         Aaturday March ", "%s %s", str,str1);
        printf("首尾有空格,只取Aaturday(過濾掉第一個空格/tab):*%s*\n",str);
        printf("首尾有空格,只取Aaturday(過濾掉第一個空格/tab):*%s*\n",str1);
        sscanf(" Aaturday March ", "%*[ ]%[ ]", str,str1);
        printf("首尾有空格,只取March(過濾掉首尾空格):*%s*\n",str1);
        //分割字串
        char sztime1[16] = "", sztime2[16] = "";
        sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
        printf("%s %s\n",sztime1,sztime2);
        char sztime21[16] = "", sztime22[16] = "";
        sscanf("2006:03:18-2006:04:18", "%[0-9,:] - %[0-9,:]", sztime21, sztime22);
        printf("%s %s\n",sztime21,sztime22);
        return(0);
}

參考連結:https://blog.csdn.net/weixin_42167759/article/details/80403578

相關推薦

函式 —— scanf() fscanf() sscanf() 分析sscanf表示式用法

       int scanf(const char *format, ...);       int fscanf(FILE *stream, const char *format, ...);       int sscanf(const char *str, cons

jQuery原始碼分析——常用表示式RegExp

常用的數字正則(嚴格匹配) 正則 含義 ^[1-9]\d*$ 匹配正整數 ^-[1-9]\d*$ 匹配負整數 ^-?[1-9]\d*$ 匹配整數 ^[1-9]\d*|0$ 匹配非負整數(正整數 +

請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次包含0次。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字

本題源自劍指offer ----------------------------------------------------------------------------------- 如果模式串遇到*字元則有兩種狀態,第一匹配字元,則字串後移一位,模式串不變,第二,

表達式完成xpath的功能強大的表達式

atime quest fin tle clas 12px int time xpath 1 url = ‘http://money.163.com/special/pinglun‘ 2 response = requests.get(url) 3 # regex = r

字元??bugku表示式學習

題目 通過讀程式碼可以看出只要我們構造出符合正則表示式的字串通過GET傳參傳過去就可以看到 key 即 flag 通過這道題看了很多正則表示式的語法規則…… ------------------------------------------------------------

python—【爬蟲】學習_2(表示式3.re模組函式的深入理解

1. re.complie() 作用:如果需要重複地使用某個正則表示式,那麼你可以先將該正則表示式編譯成模式物件。complie()函式就幫助我們將正則表示式,編譯成為一個pattern物件。 2.re.search(pattern ,string) regex.search(strin

鬥圖網鬥圖全站爬取表示式re

import  re  import requests import os class doutu_spyder():     first_url=[]     first_name=[]     headers=

python學習之-re模組表示式模組

什麼是正則表示式 正則就是用一些具有特殊含義的符號組合到一起(稱為正則表示式)來描述字元或者字串的方法。或者說:正則就是用來描述一類事物的規則。(在Python中)它內嵌在Python中,並通過 re 模組實現。正則表示式模式被編譯成一系列的位元組碼,然後由用 C 編寫的匹配引擎執行。 生活中處處都是正則

SQL Server 效能優化實戰系列(一) SQL Server擴充套件函式的基本概念 使用SQL Server 擴充套件函式進行效能優化 SQL Server Url表示式 記憶體常駐 完美解決方案

資料庫伺服器主要用於儲存、查詢、檢索企業內部的資訊,因此需要搭配專用的資料庫系統,對伺服器的相容性、可靠性和穩定性等方面都有很高的要求。        下面是進行籠統的技術點說明,為的是讓大家有一個整體的概念,如果想深入可以逐個擊破;&n

python爬蟲的re庫表示式匹配

re庫是python中自帶的一個庫,不需要外部匯入。 它主要是支援正則表示式匹配。 下面來說一下其主要功能函式: 函式 說明 re.search() 在一個字串中搜索匹配正則表示式的第

js筆記表示式

//\b 單詞邊界 //\B 非單詞邊界 例5:     var reg = /\bcde\B/g;     str = "abc cdefgh"; //str.match(reg)  返回結果為"cde" //\t匹配的不是視覺上的縮排,而是內容上的\t 同理:\n 也是

學生管理表單驗證練手表示式方式

學習菜鳥的正則表示式時看到的,拿來練習做了些許修改 話不多說,直接上圖 程式碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &

大資料工作中常用的20條語句hive,yarn,Linux,表示式

1.檢視hadoop任務 yarn application -list |grep 使用者名稱 yarn application -kill application_1443009203033_86621 2.liunx nohup命令 nohup ./label_driver.sh >

leetcode 10 Regular Expression Matching簡單表示式匹配

最近程式碼寫的少了,而leetcode一直想做一個python,c/c++解題報告的專題,c/c++一直是我非常喜歡的,c語言程式設計練習的重要性體現在linux核心程式設計以及一些大公司演算法上機的要求,python主要為了後序轉型資料分析和機器學習,所以今天

LeetCode—wildcard-matching表示式匹配—java

題目描述:Implement wildcard pattern matching with support for'?'and'*'.'?' Matches any single character. '*' Matches any sequence of character

Java 之路 (十三) -- 字串String、表示式

個人吐槽:對於這章,第一遍讀和重讀之後果然看法不同:第一次讀時覺得,文章用了大篇幅來介紹 API,這樣我可以比較容易理解這個方法是幹嘛的,以此理解這個類是幹嘛的;但是重讀之後覺得,文章居然用了這麼大篇幅在講 API(尤其是正則表示式),如果我需要知道具體某

高效能JavaScript字串和表示式

 字串連線 +/+=操作符連線 str += "one" + "two"; 這是常用的連線字串的方法,它執行的時候會經歷下面四個步驟: 1、在記憶體中建立一個臨時字串; 2、連線後的”onetwo”被賦值給這個臨時字串; 3、臨時字串與str的當前值連線; 4、連線後的結果賦值給str

介面測試工具-Jmeter使用筆記五:表示式提取器

(正則表示式提取器是Jmeter關聯中的一種)使用場景: 有兩個HTTP請求,請求A的返回資料中有一個欄位“ABCD”,該欄位要作為請求B的入參。 1、新增方式 請求A上右鍵-->後置處理器->正則表示式提取器 2、提取A請求中的taskCode對應的值 為了獲取到上圖中圈起來的這個值,要配置

Python抓取網頁&批量下載檔案方法初探表示式+BeautifulSoup

最近兩週都在學習Python抓取網頁方法,任務是批量下載網站上的檔案。對於一個剛剛入門python的人來說,在很多細節上都有需要注意的地方,以下就分享一下我在初學python過程中遇到的問題及解決方法。 一、用Python抓取網頁 基本方法: import urllib

Shell獲取網絡卡Mac地址grep、表示式

#!/bin/bash #brief attain the Mac addr of netcard eth0. #author lee #time 18.08.10 macaddr=`sudo