函式 —— scanf() fscanf() sscanf() (分析sscanf正則表示式的用法)
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(){
************************************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",&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