字符串函數 sscanf() 詳解

什么是 sscanf() 函數?

sscanf() 函數是 C 語言中的一個標準庫函數,它的作用是從一個字符串中按照指定的格式提取數據,并將其存儲到對應的變量中。它的原型如下:

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

其中,str?是要解析的字符串,format?是格式控制字符串,后面是一系列的指針參數,用來接收解析后的數據。sscanf() 函數返回成功匹配和賦值的個數,如果發生錯誤或到達字符串末尾,則返回 EOF。

sscanf() 函數的格式控制字符串

sscanf() 函數的格式控制字符串是由一些格式說明符組成的,每個格式說明符都以?%?開始,用來指定要提取的數據的類型和方式。格式說明符的一般形式是:

%[*][width][modifiers]type

其中,各個部分的含義如下:

  • *?是一個可選的星號,表示忽略該數據,不存儲到對應的參數中。
  • width?是一個可選的整數,表示要讀取的最大字符數。
  • modifiers?是一些可選的修飾符,用來指定數據的大小或精度,常見的有:
    • h?表示短整型(對于?di?和?n),或無符號短整型(對于?ou?和?x)。
    • l?表示長整型(對于?di?和?n),或無符號長整型(對于?ou?和?x),或雙精度浮點型(對于?ef?和?g)。
    • L?表示長雙精度浮點型(對于?ef?和?g)。
  • type?是一個必需的字符,表示要提取的數據的類型,常見的有:
    • c?表示單個字符,如果指定了?width,則會讀取?width?個字符,并存儲到一個字符數組中。
    • d?表示十進制整數,數字前面的?+?或?-?號是可選的。
    • eEfgG?表示浮點數,包含了一個小數點,一個可選的前置符號?+?或?-,一個可選的后置字符?e?或?E,以及一個十進制指數。
    • o?表示八進制整數。
    • s?表示字符串,會讀取連續的非空白字符,直到遇到一個空白字符為止。
    • u?表示無符號的十進制整數。
    • xX?表示十六進制整數。
    • [?表示字符集合,會讀取符合指定字符集合的連續字符,直到遇到一個不符合的字符為止。字符集合可以用?-?表示范圍,例如?[0-9]?表示數字,也可以用?^?表示取反,例如?[^a-z]?表示非小寫字母。如果字符集合以?^?開始,則?^?不表示取反,而是表示本身,例如?[^^]?表示非?^?的字符。

sscanf() 函數的使用示例

下面給出一些使用 sscanf() 函數的示例,以及相應的輸出結果。

#include <stdio.h>int main()
{char str[100] = "2021-03-01 10:44:00"; // 要解析的字符串int year, month, day, hour, minute, second; // 存儲解析后的數據的變量int n; // 存儲 sscanf() 函數的返回值// 從字符串中按照指定的格式提取數據n = sscanf(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);// 輸出提取的數據和返回值printf("year = %d\n", year);printf("month = %d\n", month);printf("day = %d\n", day);printf("hour = %d\n", hour);printf("minute = %d\n", minute);printf("second = %d\n", second);printf("n = %d\n", n);return 0;
}

輸出結果為:

year = 2021
month = 3
day = 1
hour = 10
minute = 44
second = 0
n = 6

從輸出結果可以看出,sscanf() 函數成功地從字符串中提取了年月日時分秒的數據,并存儲到對應的變量中,返回值為 6,表示有 6 個數據被匹配和賦值。

下面再看一個使用字符集合的示例:

#include <stdio.h>int main()
{char str[100] = "Hello, world!"; // 要解析的字符串char word1[20], word2[20]; // 存儲解析后的數據的變量int n; // 存儲 sscanf() 函數的返回值// 從字符串中按照指定的格式提取數據n = sscanf(str, "%[^,], %s", word1, word2);// 輸出提取的數據和返回值printf("word1 = %s\n", word1);printf("word2 = %s\n", word2);printf("n = %d\n", n);return 0;
}

輸出結果為:

word1 = Hello
word2 = world!
n = 2

從輸出結果可以看出,sscanf() 函數使用了字符集合?[^,]?來提取第一個逗號之前的字符串,然后使用了?s?來提取第一個空格之后的字符串,返回值為 2,表示有 2 個數據被匹配和賦值。

sscanf() 函數的注意事項

在使用 sscanf() 函數時,需要注意以下幾點:

  • sscanf() 函數會從字符串的開頭開始解析,如果遇到不符合格式的字符,就會停止解析,并返回已經匹配和賦值的個數。因此,要保證字符串的格式和格式控制字符串的格式一致,否則可能會導致解析失敗或不完全。
  • sscanf() 函數的格式控制字符串中可以包含空格字符、制表符、換行符等,它們會被忽略,不影響解析。但是,如果要匹配字符串中的空白字符,就不能使用?s?類型,而要使用?c?類型或字符集合類型,并指定?width?為 1。
  • sscanf() 函數的后面的指針參數必須和格式說明符的類型一致,否則可能會導致數據錯誤或內存溢出。例如,如果要提取一個整數,就不能使用?char *?類型的參數,而要使用?int *?類型的參數,并在變量名前加上?&?符號,表示取地址。
  • sscanf() 函數不會在提取的字符串后面自動添加空字符,因此,如果要將提取的字符串作為一個完整的字符串使用,就需要手動在后面添加空字符,或者在定義字符數組時多預留一個空間,用來存儲空字符。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713476.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Project_Euler-44 題解

Project_Euler-44 題解 題目 思路 題目給出了一個性質&#xff0c;讓我在對應性質的數據中找出目標值&#xff0c;這種問題首先想到的就是枚舉。 我們可以枚舉 P k P_k Pk? &#xff0c;對于每一個 P k P_k Pk? &#xff0c;我們再枚舉 P j P_j Pj?&#xff0c; P j P_…

【ue5】滑鏟系統藍圖筆記

大致邏輯如下&#xff1a; 一、導入動畫 滑鏟蹲待機蹲行走 導入到文件夾中 可以右鍵設置顏色&#xff0c;便于區分。 二、調整動畫 1.啟動根運動 啟動根運動后&#xff0c;人物才可以位移&#xff0c;不然只能在原地。 打開動畫序列&#xff0c;勾選啟用根運動Enabled…

用node或者vscode開啟一個簡單的本地server服務器,加載html網頁

使用Live Server 想要加載本地html頁面可以快速能讓它在你本地瀏覽器中打開&#xff0c;可以有好多種方式&#xff0c;如果你有使用vscode&#xff0c;可以安裝一個插件&#xff1a;Live Server&#xff0c;然后直接在vscode中直接右鍵就可以開啟這個服務&#xff1a; 安裝好之…

C++基于多設計模式下的同步異步日志系統day2

&#x1f4df;作者主頁&#xff1a;慢熱的陜西人 &#x1f334;專欄鏈接&#xff1a;C基于多設計模式下的同步&異步日志系統 &#x1f4e3;歡迎各位大佬&#x1f44d;點贊&#x1f525;關注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要內容實現了日志代碼設計的實…

在 Spring Boot 3.x 中使用 SpringDoc 2 / Swagger V3

SpringDoc V1 只支持到 Spring Boot 2.x springdoc-openapi v1.7.0 is the latest Open Source release supporting Spring Boot 2.x and 1.x. Spring Boot 3.x 要用 SpringDoc 2 / Swagger V3, 并且包名也改成了 springdoc-openapi-starter-webmvc-ui SpringDoc V2 https://s…

select,poll和epoll有什么區別

它們都是NIO中多路復用的三種實現機制&#xff0c;是由linux操作系統提供的。 用戶空間和內核空間&#xff1a;操作系統為了保證系統安全&#xff0c;將內核分為兩個部分&#xff0c;一個是用戶空間&#xff0c;一個是內核空間。用戶空間不能直接訪問底層的硬件設備&#xff0…

IT廉連看——Uniapp——配置文件pages

IT廉連看——Uniapp——配置文件pages [IT廉連看] 本堂課主要為大家介紹pages.json這個配置文件 一、打開官網查看pages.json可以配置哪些屬性。 下面邊寫邊講解 新建一個home頁面理解一下這句話。 以下一些頁面的通用配置 通用設置里我們可以對導航欄和狀態欄進行一些設…

Android修行手冊-集成Python開發環境

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列ChatGPT和AIGC &#x1f449;關于作者 專注于Android/Unity和各種游戲開發技巧&#xff0c;以及各種資源分…

Debezium發布歷史161

原文地址&#xff1a; https://debezium.io/blog/2023/09/13/debezium-2-4-beta2-released/ 歡迎關注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻譯&#xff0c;僅供參考&#xff0c;筆芯筆芯. Debezium 2.4.0.Beta2 Released September 13, 2023 by Chris Cranfo…

Apache Flink連載(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

?? 個人主頁:IT貧道-CSDN博客 ?? 私聊博主:私聊博主加WX好友,獲取更多資料哦~ ?? 博主個人B棧地址:豹哥教你學編程的個人空間-豹哥教你學編程個人主頁-嗶哩嗶哩視頻 目錄 ?編輯

Python爬蟲——Urllib庫-2

編解碼 問題引入 例如&#xff1a; https://www.baidu.com/s?wd章若楠 https://www.baidu.com/s?wd%E7%AB%A0%E8%8B%A5%E6%A5%A0 第二部分的一串亂碼就是章若楠 如果這里是寫的章若楠就會 產生這樣的錯誤 所以我們就可以使用get請求方式的quote方法了 get請求方式的q…

laravel ApiResponse接口統一響應封裝

一&#xff0c;新增接口返回碼配置文件 在config中新增配置文件apicode.php <?phpreturn [ apicodes>[/*** Message("OK")* 對成功的 GET、PUT、PATCH 或 DELETE 操作進行響應。也可以被用在不創建新資源的 POST 操作上*/HTTP_OK > 200,/*** Message(&qu…

使用el-form之表單校驗自動定位到報錯位置問題,,提升用戶體驗

需求描述 由于需要填寫的表單項太多&#xff0c;提交的時候校驗不通過&#xff0c; 如果沒填寫的表單項在最上面&#xff0c;用戶看不到不知道發生了啥&#xff0c; 所以需要將頁面滾動定位到第一個報錯的表單項位置&#xff0c;提升用戶體驗實現步驟 1. 給form表單添加ref …

數據中心GPU集群高性能組網技術分析

數據中心GPU集群組網技術是指將多個GPU設備連接在一起&#xff0c;形成一個高性能計算的集群系統。通過集群組網技術&#xff0c;可以實現多個GPU設備之間的協同計算&#xff0c;提供更大規模的計算能力&#xff0c;適用于需要大規模并行計算的應用場景。 常用的組網技術&…

1209. 帶分數 刷題筆記

思路 暴力匹配 讀入目標數 n 看n是否與ab/c相等 因為c里面的除法是整除 我們將 nab/c 轉換為 c*na*cb 那么如何獲得a,b&#xff0c;c 依題意 a&#xff0c;b&#xff0c;c三個數由1-9九個數字組成 且每個數字只能出現一次 由此 我們可以搜出123456789的全部排列方式…

我做的app上架應用市場一天,快破400下載量,0差評

上集說到&#xff0c;我做了一個叫QB音樂的安卓app&#xff0c;經過一段時間的自我使用與測試終于算發布了。我昨天順便把它上架了奇妙應用市場&#xff0c;截止目前3月1號過去了一天&#xff0c;下載量快到400&#xff0c;0差評。看來還是能正常使用的。 一、為什么做這個ap…

CleanMyMac X2024免費Mac電腦清理和優化工具

CleanMyMac X是一款專業的 Mac 清理和優化工具&#xff0c;它具備一系列強大的功能&#xff0c;可以幫助用戶輕松管理和維護他們的 Mac 電腦。以下是一些關于 CleanMyMac X 的主要功能和特點&#xff1a; 智能清理&#xff1a;CleanMyMac X 能夠智能識別并清理 Mac 上的無用文件…

深入剖析k8s-Pod篇

為什么需要Pod&#xff1f; 進程是以進程組的方式組織在一起。受限制容器的“單進程模型”&#xff0c; 成組調用沒有被妥善處理&#xff08;資源調用有限&#xff09;&#xff0c;使用資源囤積則導致復雜度上升。 在k8s項目中&#xff0c;Pod的實現需要使用一個中間容器——…

css【詳解】—— 圣杯布局 vs 雙飛翼布局 (含手寫清除浮動 clearfix)

兩者功能效果相同&#xff0c;實現方式不同 效果預覽 兩側寬度固定&#xff0c;中間寬度自適應&#xff08;三欄布局&#xff09;中間部分優先渲染允許三列中的任意一列成為最高列 圣杯布局 通過左右欄填充容器的左右 padding 實現&#xff0c;更多細節詳見注釋。 <!DOCTYP…

《無線網絡技術》考試版筆記

第一章 無線網絡介紹 什么是多徑效應&#xff0c;如何去克服&#xff1a; 在發射機和接收機之間沒有明顯的直線路徑時&#xff0c;就會產生多徑傳播。如果兩個信號彼此疊加&#xff0c;那么接收設備就無法正確解調信號&#xff0c;無法還原為它的原始數據形式。 可以稍微調整接…