C. scanf 函數基礎

scanf 函數

  • 1. scanf 函數基礎
    • 1.1 函數原型與頭文件
    • 1.2 格式化輸入的基本概念
    • 2.1 常見格式說明符
      • 整數格式說明符
      • 浮點數格式說明符
      • 字符和字符串格式說明符
      • 其他格式說明符
    • 2.2 格式說明符的高級用法
      • 寬度修飾符
      • 精度修飾符
      • 跳過輸入
      • 字段寬度
      • 組合修飾符
      • 對齊修飾符
      • 實際應用示例
    • 3.2 精度控制
      • 浮點數精度
      • 字符串精度
      • 動態精度
      • 實際應用示例
    • 4.1 返回值的含義
    • 4.2 返回值的應用場景
      • 4.2.1 輸入校驗
      • 4.2.2 循環讀取輸入
      • 4.2.3 動態調整輸入邏輯
      • 4.2.4 調試與日志記錄
    • 5.1 格式化字符串漏洞
      • 格式化字符串漏洞的成因
      • 格式化字符串漏洞的利用
      • 格式化字符串漏洞的實例
    • 5.2 安全使用建議
      • 1. 避免用戶可控的格式化字符串
      • 2. 確保格式說明符與參數匹配
      • 3. 使用安全的格式化函數
      • 4. 檢查 `scanf` 的返回值
      • 5. 避免使用 `%n` 格式說明符
      • 6. 使用編譯器的安全檢查功能
    • 6.1 fscanf
      • 使用場景
      • 返回值
    • 6.2 sscanf
      • 使用場景
      • 返回值
    • 7.1 日常編程中的使用場景
      • 1. 輸入用戶數據
      • 2. 讀取配置文件
      • 3. 輸入表格數據
      • 4. 輸入帶條件的數據
      • 5. 輸入帶時間戳的數據
    • 7.2 復雜格式化輸入示例
      • 1. 輸入多行格式化數據
      • 2. 動態格式化輸入
      • 3. 輸入帶有顏色的文本
      • 4. 輸入帶有條件的文本
      • 5. 輸入帶有時間戳的日志信息

1. scanf 函數基礎

1.1 函數原型與頭文件

scanf 函數是 C 語言中用于格式化輸入的標準函數,其函數原型定義在頭文件 <stdio.h> 中。具體原型如下:

int scanf(const char *format, ...);
  • const char *format:格式控制字符串,用于指定輸入的格式。它由普通字符和格式說明符組成。普通字符用于匹配輸入中的相同字符,而格式說明符則用于指定后續參數的輸入格式。
  • ...:表示可變參數列表,這些參數是用于存儲輸入數據的變量的地址。每個格式說明符對應一個參數,參數的類型必須與格式說明符匹配。

在使用 scanf 函數時,必須包含頭文件 <stdio.h>,否則編譯器將無法識別該函數。

1.2 格式化輸入的基本概念

scanf 函數通過格式控制字符串來實現靈活的輸入。格式控制字符串中的格式說明符以 % 開頭,后跟一個或多個字符,用于指定輸入數據的類型和格式。以下是一些常見的格式說明符及其含義:

格式說明符含義
%d%i輸入有符號十進制整數。例如:scanf("%d", &var); 輸入 123var 的值為 123
%u輸入無符號十進制整數。例如:scanf("%u", &var); 輸入 456var 的值為 456
%f輸入浮點數。例如:scanf("%f", &var); 輸入 3.14var 的值為 3.14
%c輸入單個字符。例如:scanf("%c", &var); 輸入 Avar 的值為 A
%s輸入字符串。例如:scanf("%s", str); 輸入 Hellostr 的值為 "Hello"
%p輸入指針地址。例如:scanf("%p", &ptr); 輸入地址,ptr 的值為該地址。
%%輸入一個百分號 %。例如:scanf("%%", &var); 輸入 %var 的值為 %

格式說明符還可以包含一些可選的修飾符,用于控制輸入的寬度、精度、對齊方式等。以下是一些常見的修飾符及其用法:

  • 寬度修飾符:指定輸入的最大寬度。對于字符串,指定最大輸入字符數。例如:

    char str[10];
    scanf("%9s", str); // 最多讀取 9 個字符
    
  • 精度修飾符:對于浮點數,指定小數點后的位數。例如:

    float var;
    scanf("%f", &var); // 默認讀取浮點數
    
  • 對齊修飾符- 用于左對齊,+ 用于強制輸出正負號,空格用于在正數前輸出空格。例如:

    int var;
    scanf("%d", &var); // 默認讀取整數
    

通過合理使用格式說明符和修飾符,scanf 函數可以實現靈活多樣的格式化輸入,滿足各種編程需求。# 2. 格式說明符詳解

2.1 常見格式說明符

scanf 函數的格式說明符是實現格式化輸入的核心,以下是一些常見的格式說明符及其詳細用法:

整數格式說明符

  • %d%i:用于輸入有符號十進制整數。這是最常用的整數格式說明符,適用于正負整數。

    int var;
    scanf("%d", &var); // 輸入 123,var 的值為 123
    
  • %u:用于輸入無符號十進制整數。它適用于非負整數,輸入時不會顯示負號。

    unsigned int var;
    scanf("%u", &var); // 輸入 456,var 的值為 456
    
  • %o:用于輸入無符號八進制整數。輸入時需要以八進制形式輸入,不顯示前綴 0

    int var;
    scanf("%o", &var); // 輸入 377,var 的值為 255
    
  • %x%X:用于輸入無符號十六進制整數。%x 輸入小寫字母,%X 輸入大寫字母。

    int var;
    scanf("%x", &var); // 輸入 ff,var 的值為 255
    scanf("%X", &var); // 輸入 FF,var 的值為 255
    

浮點數格式說明符

  • %f:用于輸入十進制浮點數。默認情況下,scanf 會讀取小數點和數字,直到遇到非數字字符為止。

    float var;
    scanf("%f", &var); // 輸入 3.14159,var 的值為 3.14159
    
  • %e%E:用于輸入科學計數法表示的浮點數。%e 輸入小寫字母 e%E 輸入大寫字母 E

    float var;
    scanf("%e", &var); // 輸入 3.14159e+00,var 的值為 3.14159
    scanf("%E", &var); // 輸入 3.14159E+00,var 的值為 3.14159
    

字符和字符串格式說明符

  • %c:用于輸入單個字符。輸入時只讀取一個字符,包括空格和換行符。

    char var;
    scanf("%c", &var); // 輸入 A,var 的值為 'A'
    
  • %s:用于輸入字符串。輸入時會讀取連續的字符,直到遇到空格、制表符或換行符為止。

    char str[10];
    scanf("%s", str); // 輸入 Hello,str 的值為 "Hello"
    

其他格式說明符

  • %p:用于輸入指針地址。輸入時需要輸入一個有效的指針地址。

    int *ptr;
    scanf("%p", &ptr); // 輸入地址,ptr 的值為該地址
    
  • %%:用于輸入一個百分號 %。輸入時需要輸入一個 % 符號。

    char var;
    scanf("%%", &var); // 輸入 %,var 的值為 '%'
    

2.2 格式說明符的高級用法

格式說明符還可以結合多種修飾符來實現更復雜的格式化輸入,以下是一些高級用法:

寬度修飾符

寬度修飾符用于指定輸入的最大寬度。對于字符串,指定最大輸入字符數。可以通過以下方式指定寬度:

  • 固定寬度:直接指定一個整數。

    char str[10];
    scanf("%9s", str); // 最多讀取 9 個字符
    
  • 動態寬度:使用 * 表示寬度由后續參數指定。

    int width = 9;
    scanf("%*s", &width, str); // 最多讀取 9 個字符
    

精度修飾符

精度修飾符用于控制輸入的精度,對于浮點數和字符串有不同的含義:

  • 浮點數:指定小數點后的位數。

    float var;
    scanf("%f", &var); // 默認讀取浮點數
    
  • 字符串:指定最大輸入長度。

    char str[10];
    scanf("%.9s", str); // 最多讀取 9 個字符
    

跳過輸入

使用 * 修飾符可以跳過某些輸入項,不將其存儲到變量中。例如:

int a, b;
scanf("%d %*d %d", &a, &b); // 輸入 1 2 3,a 的值為 1,b 的值為 3

字段寬度

字段寬度修飾符用于指定輸入字段的寬度。對于字符串,指定最大輸入字符數。對于數字,指定最大輸入數字的位數。例如:

int a;
scanf("%3d", &a); // 輸入 1234,a 的值為 123

組合修飾符

可以將多種修飾符組合使用,以實現復雜的格式化需求:

char str[10];
scanf("%-9.5s", str); // 最多讀取 9 個字符,字符串的最大長度為 5
```# 3. 輸入控制與格式化
## 3.1 寬度與對齊`scanf` 函數通過寬度修飾符和對齊修飾符來控制輸入的寬度和

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

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

相關文章

spring cloud loadbalancer實現機房感知的負載均衡

1 概述 在同城多機房情景下&#xff0c;各個機房各自部署一套微服務集群&#xff0c;正常情況下微服務調用在本機房閉環。在如下某些災難情景&#xff0c;可以嘗試拉遠調用以最大程度維持業務連續性&#xff0c;這些情景例如&#xff1a; A機房多個服務器宕機。應用由于BUG發…

vue中,created和mounted兩個鉤子之間調用時差值受什么影響

在 Vue 中&#xff0c;created 和 mounted 是兩個生命周期鉤子&#xff0c;它們之間的調用時差主要受以下幾個因素影響&#xff1a; &#x1f7e2; 1. 模板復雜度與渲染耗時&#xff08;最主要因素&#xff09; mounted 的觸發時間是在組件的 DOM 被掛載之后&#xff08;也就是…

Linux篇 第2章Linux基礎指令

Linux篇 第2章Linux基礎指令 文章目錄 前言一、基礎的一些命令1.pwd2.mkdir3.ls4.cd5.clear 二、ls1.ls -l2.ls -a3.ls -l -a 三、touch四、 cd1.cd /2.cd ..3.cd ~4. cd - 五、tree1. Linux系統文件的結構2.絕對路徑和相對路徑 六、mkdir -p七、rmdir&#xff08;沒啥用&#…

Scrapyd 詳解:分布式爬蟲部署與管理利器

Scrapyd 是 Scrapy 官方提供的爬蟲部署與管理平臺&#xff0c;支持分布式爬蟲部署、定時任務調度、遠程管理爬蟲等功能。本文將深入講解 Scrapyd 的核心功能、安裝配置、爬蟲部署流程、API 接口使用&#xff0c;以及如何結合 Scrapy-Redis 實現分布式爬蟲管理。通過本文&#x…

國產免費工作流引擎star 6.5k,Warm-Flow升級1.7.2(新增案例和修復缺陷)

文章目錄 主要更新內容項目介紹功能思維導圖設計器流程圖演示地址官網Warm-Flow視頻 主要更新內容 [feat] 開啟流程實例&#xff0c;新增流程定義是否存在校驗[feat] 新增合同簽訂流程案例[feat] 新增企業采購流程案例[update] mybatis-plus邏輯刪除&#xff0c;刪除值和未刪除…

數據倉庫Hive

1.數據倉庫 1.1數據倉庫的概念 數據倉庫&#xff08;Data Warehouse&#xff09;是一個面向主題的、集成的、相對穩定的、反映歷史變化的數據集合&#xff0c;用于支持管理決策。 面向主題。操作型數據庫的數據組織面向事務處理任務&#xff0c;而數據倉庫中的數據按照一定的…

dify 連接不上ollama An error occurred during credentials validation:

三大報錯 An error occurred during credentials validation: HTTPConnectionPool(hosthost.docker.internal, port11434): Max retries exceeded with url: /api/chat (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f26fc3c00b0&…

uniapp 生成海報二維碼 (微信小程序)

先下載qrcodenpm install qrcode 調用 community_poster.vue <template><view class"poster-page"><uv-navbar title"物業推廣碼" placeholder autoBack></uv-navbar><view class"community-info"><text clas…

如何理解編程中的遞歸、迭代與回歸?

作為編程初學者&#xff0c;遞歸、迭代和回歸這三個概念常常讓人感到困惑。本文將通過生活化的比喻、Python代碼示例和直觀的對比&#xff0c;幫助你徹底理解這三個重要概念及其應用場景。 一、從生活比喻理解核心概念 1. 遞歸&#xff08;Recursion&#xff09;—— 俄羅斯套…

Android Studio 模擬器配置方案

Android Studio 模擬器配置方案 1.引言2.使用Android Studio中的模擬器3.使用國產模擬器1.引言 前面介紹【React Native基礎環境配置】的時候需要配置模擬器,當時直接使用了USB調試方案,但是有些時候可能不太方便連接手機調試,比如沒有iPhone調不了ios。接下來說明另外兩種可…

uniapp(vue3)動態計算swiper高度封裝自定義hook

// useCalculateSwiperHeight.ts import { ref, onMounted } from vue;export function useCalculateSwiperHeight(headerSelector: string .header-search, tabsWrapperSelector: string .u-tabs .u-tabs__wrapper) {const swiperHeight ref<number>(0);// 封裝uni.g…

從代碼學習深度學習 - 轉置卷積 PyTorch版

文章目錄 前言基本操作填充、步幅和多通道填充 (Padding)步幅 (Stride)多通道總結前言 在卷積神經網絡(CNN)的大家族中,我們熟悉的卷積層和匯聚(池化)層通常會降低輸入特征圖的空間維度(高度和寬度)。然而,在許多應用場景中,例如圖像的語義分割(需要對每個像素進行分…

c語言第一個小游戲:貪吃蛇小游戲06

實現貪吃蛇四方向的風騷走位 實現代碼 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; int key; int dir; //全局變量 #define UP 1 //這個是宏定義&a…

django的權限角色管理(RBAC)

在 Django 中&#xff0c;User、Group 和 Permission 是權限系統的核心組件。下面通過代碼示例演示它們的 CRUD&#xff08;創建、讀取、更新、刪除&#xff09; 操作&#xff1a; 一、User 模型 CRUD from django.contrib.auth.models import User# 創建用戶 user User.obje…

解決docker alpine缺少字體的問題 Could not initialize class sun.awt.X11FontManager

制作的springboot項目鏡像&#xff0c;缺少字體報錯Could not initialize class sun.awt.X11FontManager 原因鏡像中缺少字體 解決&#xff1a; 制作鏡像時&#xff0c;添加字體庫&#xff0c;Dockerfile文件 中添加如下內容 注意&#xff1a; jdk版本一定要使用&#xff0…

MQTT 在Spring Boot 中的使用

在 Spring Boot 中使用 MQTT 通常會借助 Spring Integration 項目提供的 MQTT 支持。這使得 MQTT 的集成可以很好地融入 Spring 的消息驅動和企業集成模式。 以下是如何在 Spring Boot 中集成和使用 MQTT 的詳細步驟&#xff1a; 前提條件&#xff1a; MQTT Broker&#xff…

養生:為健康生活注入活力

在快節奏的現代生活中&#xff0c;養生不再是老年人的專屬&#xff0c;而是每個人維持身心健康的必修課。從飲食到運動&#xff0c;從睡眠到心態&#xff0c;全方位的養生方式能幫助我們抵御壓力&#xff0c;擁抱充滿活力的生活。 飲食養生&#xff1a;合理搭配&#xff0c;滋…

Axure設計之內聯框架切換頁面、子頁面間跳轉問題

在Axure中&#xff0c;你可以通過以下步驟實現主頁面中的內聯框架在點擊按鈕時切換頁面內容&#xff0c;從A頁面切換到B頁面。&#xff08;誤區&#xff1a;子頁面之間切換不要設置“框架中打開鏈接”然后選“父級框架”這個交互&#xff09; 主框架頁面&#xff08;左側導航展…

[思維模式-38]:看透事物的關系:什么是事物的關系?事物之間的關系的種類?什么是因果關系?如何通過數學的方式表達因果關系?

一、什么是事物的關系&#xff1f; 事物的關系是指不同事物之間存在的各種聯系和相互作用&#xff0c;它反映了事物之間的相互依存、相互影響、相互制約等特性。以下從不同維度為你詳細闡述&#xff1a; 1、關系的類型 因果關系 定義&#xff1a;一個事件&#xff08;原因&a…

OJ判題系統第6期之判題邏輯開發——設計思路、實現步驟、代碼實現(策略模式)

在看這期之前&#xff0c;建議先看前五期&#xff1a; Java 原生實現代碼沙箱&#xff08;OJ判題系統第1期&#xff09;——設計思路、實現步驟、代碼實現-CSDN博客 Java 原生實現代碼沙箱之Java 程序安全控制&#xff08;OJ判題系統第2期&#xff09;——設計思路、實現步驟…