C 標準庫 - <stddef.h>和<stdio.h>詳解

目錄

C 標準庫 -?

簡介

庫變量

庫宏

實例

C 標準庫 -?

簡介

庫變量

庫宏

庫函數

實例


C 標準庫 -?<stddef.h>

簡介

<stdio.h> 是 C 語言中的一個標準庫,它提供了一些常用的函數和類型定義,用于處理與大小相關的操作。

庫變量

在 <stddef.h> 中定義的類型有:

  1. size_t:無符號整數類型,用于表示對象的大小。
  2. ptrdiff_t:有符號整數類型,用于表示兩個指針之間的差值。
  3. wchar_t:寬字符類型,在處理寬字符時使用。

這些類型在 C 語言中經常被用于標準庫函數中,以提供對大小、指針操作和寬字符的支持。

庫宏

<stddef.h> 頭文件中定義了一些常用的宏。

  1. NULL:空指針常量的值。
  2. offsetof(type, member-designator):生成一個類型為 size_t 的整型常量,它表示結構體成員相對于結構體起始位置的字節偏移量。其中,type 表示結構體類型,member-designator 表示結構體成員的標識符。

值得注意的是,offsetof 宏只能用于標準數據類型中的結構體和聯合體,不能用于位域。使用時應該遵循 C 語言的規范,同時需要注意不同編譯器可能對其實現方式存在差異。

實例

#include <stdio.h>
#include <stddef.h>int main() {int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};size_t size = sizeof(arr); // 計算數組 arr 的大小ptrdiff_t diff = &arr[5] - &arr[0]; // 計算指針差值printf("數組 arr 的大小為 %zu\n", size); // 使用 %zu 輸出 size_t 類型printf("&arr[5] - &arr[0] 的差值為 %td\n", diff); // 使用 %td 輸出 ptrdiff_t 類型struct Person {char name[20];int age;double height;};size_t offset = offsetof(struct Person, age); // 計算結構體成員偏移量printf("結構體成員 age 在結構體中的偏移量為 %zu\n", offset); // 使用 %zu 輸出 size_t 類型return 0;
}

在這個示例中,我們首先定義了一個整型數組 arr,然后使用 sizeof 計算了數組的大小,并使用 & 運算符獲取了數組中兩個元素的地址,用于計算指針差值。接著我們定義了一個名為 Person 的結構體,使用 offsetof 宏計算了結構體成員 age 相對于結構體起始位置的偏移量,并將結果輸出到屏幕上。最后返回 0 表示程序正常結束。

值得注意的是,在使用 size_t 和 ptrdiff_t 類型時,我們分別使用了 %zu 和 %td 作為格式化輸出的占位符。這是因為 size_t 是無符號整數類型,而 ptrdiff_t 是有符號整數類型,它們的輸出格式與普通的整型類型不同。

讓我們編譯并運行上面的程序,這將產生以下結果:

數組 arr 的大小為 40
&arr[5] - &arr[0] 的差值為 5
結構體成員 age 在結構體中的偏移量為 20

C 標準庫 -?<stdio.h>

簡介

<stdio.h> 是 C 標準庫中的頭文件,它定義了與輸入和輸出相關的變量類型、宏和函數。這個頭文件提供了對標準輸入、標準輸出和文件操作的支持。

庫變量

  1. size_t:這是一種無符號整數類型,用于表示對象的大小。通常用于 sizeof 運算符的結果。例如,可以使用 size_t 來表示數組的大小或緩沖區的長度。

  2. FILE:這是一個結構體類型,用于表示文件流的信息。它包含了操作文件所需的所有信息,如文件指針、文件狀態標志、讀寫位置等。通過使用 FILE 類型的指針,我們可以打開、關閉、讀取和寫入文件。

  3. fpos_t:這是一種類型,用于存儲文件中任意位置的信息。它可以表示文件中的任何偏移量。fpos_t 類型的變量通常與 fseek 和 fgetpos 等函數一起使用,用于在文件中進行定位和操作。

庫宏

下面是頭文件 stdio.h 中定義的宏:

  1. NULL:這是一個空指針常量的值。通常用于初始化指針變量,以表示它們不指向任何有效的內存地址。

  2. _IOFBF、_IOLBF 和 _IONBF:這些宏用于 setvbuf 函數的第三個參數,用于設置文件的緩沖類型。_IOFBF 表示全緩沖,_IOLBF 表示行緩沖,_IONBF 表示無緩沖。

  3. BUFSIZ:這是一個整數值,代表了 setbuf 函數使用的緩沖區大小。對于標準 I/O 庫而言,這通常是一個較大的數值(如 512 或 1024),以便提高讀寫效率。

  4. EOF:這是一個負整數值,用于表示已經到達文件結束或讀寫操作失敗的情況。在標準輸入輸出函數中,當遇到文件結束或錯誤時,它們會返回 EOF。

  5. FOPEN_MAX:這是一個整數值,代表了系統可以同時打開的文件數量。通常情況下,它的值是一個較大的數值(如 256 或更多)。

  6. FILENAME_MAX:這是一個整數值,代表了字符數組可以存儲的文件名的最大長度。如果實現沒有任何限制,則該值應為推薦的最大值。

  7. L_tmpnam:這是一個整數值,代表了字符數組可以存儲的由 tmpnam 函數創建的臨時文件名的最大長度。

  8. SEEK_CUR、SEEK_END 和 SEEK_SET:這些宏用于在 fseek 函數中進行文件定位。它們分別表示當前位置、文件尾和文件開頭。

  9. TMP_MAX:這是一個整數值,代表了 tmpnam 函數可生成的獨特文件名的最大數量。

  10. stderr、stdin 和 stdout:這些宏是指向 FILE 類型的指針,分別對應于標準錯誤、標準輸入和標準輸出流。它們通常被用作默認的文件指針,以方便進行輸入輸出操作。

庫函數

下面是頭文件 stdio.h 中定義的函數:

為了更好地理解函數,請按照下面的序列學習這些函數,因為第一個函數中創建的文件會在后續的函數中使用到。
序號函數 & 描述
1int fclose(FILE *stream)
關閉流 stream。刷新所有的緩沖區。
2void clearerr(FILE *stream)
清除給定流 stream 的文件結束和錯誤標識符。
3int feof(FILE *stream)
測試給定流 stream 的文件結束標識符。
4int ferror(FILE *stream)
測試給定流 stream 的錯誤標識符。
5int fflush(FILE *stream)
刷新流 stream 的輸出緩沖區。
6int fgetpos(FILE *stream, fpos_t *pos)
獲取流 stream 的當前文件位置,并把它寫入到 pos。
7FILE *fopen(const char *filename, const char *mode)
使用給定的模式 mode 打開 filename 所指向的文件。
8size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
從給定流 stream 讀取數據到 ptr 所指向的數組中。
9FILE *freopen(const char *filename, const char *mode, FILE *stream)
把一個新的文件名 filename 與給定的打開的流 stream 關聯,同時關閉流中的舊文件。
10int fseek(FILE *stream, long int offset, int whence)
設置流 stream 的文件位置為給定的偏移 offset,參數?offset?意味著從給定的?whence?位置查找的字節數。
11int fsetpos(FILE *stream, const fpos_t *pos)
設置給定流 stream 的文件位置為給定的位置。參數?pos?是由函數 fgetpos 給定的位置。
12long int ftell(FILE *stream)
返回給定流 stream 的當前文件位置。
13size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
把 ptr 所指向的數組中的數據寫入到給定流 stream 中。
14int remove(const char *filename)
刪除給定的文件名 filename,以便它不再被訪問。
15int rename(const char *old_filename, const char *new_filename)
把 old_filename 所指向的文件名改為 new_filename。
16void rewind(FILE *stream)
設置文件位置為給定流 stream 的文件的開頭。
17void setbuf(FILE *stream, char *buffer)
定義流 stream 應如何緩沖。
18int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
另一個定義流 stream 應如何緩沖的函數。
19FILE *tmpfile(void)
以二進制更新模式(wb+)創建臨時文件。
20char *tmpnam(char *str)
生成并返回一個有效的臨時文件名,該文件名之前是不存在的。
21int fprintf(FILE *stream, const char *format, ...)
發送格式化輸出到流 stream 中。
22int printf(const char *format, ...)
發送格式化輸出到標準輸出 stdout。
23int sprintf(char *str, const char *format, ...)
發送格式化輸出到字符串。
24int vfprintf(FILE *stream, const char *format, va_list arg)
使用參數列表發送格式化輸出到流 stream 中。
25int vprintf(const char *format, va_list arg)
使用參數列表發送格式化輸出到標準輸出 stdout。
26int vsprintf(char *str, const char *format, va_list arg)
使用參數列表發送格式化輸出到字符串。
27int fscanf(FILE *stream, const char *format, ...)
從流 stream 讀取格式化輸入。
28int scanf(const char *format, ...)
從標準輸入 stdin 讀取格式化輸入。
29int sscanf(const char *str, const char *format, ...)
從字符串讀取格式化輸入。
30int fgetc(FILE *stream)
從指定的流 stream 獲取下一個字符(一個無符號字符),并把位置標識符往前移動。
31char *fgets(char *str, int n, FILE *stream)
從指定的流 stream 讀取一行,并把它存儲在 str 所指向的字符串內。當讀取?(n-1)?個字符時,或者讀取到換行符時,或者到達文件末尾時,它會停止,具體視情況而定。
32int fputc(int char, FILE *stream)
把參數 char 指定的字符(一個無符號字符)寫入到指定的流 stream 中,并把位置標識符往前移動。
33int fputs(const char *str, FILE *stream)
把字符串寫入到指定的流 stream 中,但不包括空字符。
34int getc(FILE *stream)
從指定的流 stream 獲取下一個字符(一個無符號字符),并把位置標識符往前移動。
35int getchar(void)
從標準輸入 stdin 獲取一個字符(一個無符號字符)。
36char *gets(char *str)
從標準輸入 stdin 讀取一行,并把它存儲在 str 所指向的字符串中。當讀取到換行符時,或者到達文件末尾時,它會停止,具體視情況而定。
37int putc(int char, FILE *stream)
把參數 char 指定的字符(一個無符號字符)寫入到指定的流 stream 中,并把位置標識符往前移動。
38int putchar(int char)
把參數 char 指定的字符(一個無符號字符)寫入到標準輸出 stdout 中。
39int puts(const char *str)
把一個字符串寫入到標準輸出 stdout,直到空字符,但不包括空字符。換行符會被追加到輸出中。
40int ungetc(int char, FILE *stream)
把字符 char(一個無符號字符)推入到指定的流 stream 中,以便它是下一個被讀取到的字符。
41void perror(const char *str)
把一個描述性錯誤消息輸出到標準錯誤 stderr。首先輸出字符串 str,后跟一個冒號,然后是一個空格。
42int snprintf(char *str, size_t size, const char *format, ...)
格式字符串到 str 中。

實例

#include <stdio.h>int main() {FILE *file;char buffer[100];// 打開文件以供讀取file = fopen("D://example.txt", "r");if (file == NULL) {printf("無法打開文件\n");return 1;}// 從文件讀取數據并輸出到控制臺while (fgets(buffer, sizeof(buffer), file)) {printf("%s", buffer);}// 關閉文件fclose(file);return 0;
}

這個示例演示了如何使用fopen函數打開一個文件,并使用fgets函數從文件中逐行讀取數據存儲到緩沖區中,然后使用printf函數將數據輸出到控制臺。最后,使用fclose函數關閉文件。

請注意,示例中假設當前目錄下存在名為"example.txt"的文本文件,并且該文件可讀。如果文件不存在或無法讀取,程序將打印一條錯誤消息。

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

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

相關文章

深信服防火墻路由模式開局部署-手把手教學(小白篇)

PS&#xff1a;深信服的設備只有400能夠通過console連接&#xff0c;一般用戶是無法連接的&#xff0c;所以大家不要妄想著從Console連接設備了&#xff0c;開局就通過MANAGE進入Web就可以 接通電源后&#xff0c;開機拿一根網線&#xff0c;一端連接防火墻的MANAGE口&#xf…

uniapp uni.navigateBack返回后刷新頁面數據

方法1: 父頁面設置鉤子函數(onBackPress): 頁面簡介 | uni-app官網 適用于刷新多處數據 onBackPress(options) {this.refreshData(); }, methods:{refreshData: function() {//加載數據}, }, 方法2: 返回加success回調 uni.navigateBack({delta: 1, //返回層數&#xff0…

【C++】泛型編程 ? ( 類模板示例 - 數組類模板 | 容器思想 | 自定義類可拷貝 - 深拷貝與淺拷貝 | 自定義類可打印 - 左移運算符重載 )

文章目錄 一、容器思想1、自定義類可拷貝 - 深拷貝與淺拷貝2、自定義類可拷貝 - 代碼示例3、自定義類可打印 - 左移運算符重載 二、代碼示例1、Array.h 頭文件2、Array.cpp 代碼文件3、Test.cpp 主函數代碼文件4、執行結果 一、容器思想 1、自定義類可拷貝 - 深拷貝與淺拷貝 上…

百戰python02-語言元素

文章目錄 指令與程序變量與類型變量命名變量的使用運算符賦值運算符比較運算符和邏輯運算符練習1:華氏溫度轉換為攝氏溫度練習2:輸入圓的半徑計算計算周長和面積練習3:輸入年份判斷是不是閏年字符串常用操作注:需要對python有基本了解,可查看本作者python基礎專欄,有任何問…

大模型生態新篇章:以AI Agent為引,助企業創新應用落地

文 | 智能相對論 作者 | 沈浪 以聊天機器人、虛擬助手、智能客服等為代表的對話式人工智能 (Conversational AI Agents ) 在具體服務場景中的應用已經十分普遍。今年以來&#xff0c;隨著大模型技術的爆發與加持&#xff0c;對話式AI被市場賦予了更高的期望。 “所有行業都值…

Spring 事務失效的7種場景, 事務失效后如何進行處理

文章目錄 簡單說說spring事務失效的場景Spring 事務失效的7種場景1.1、未啟用[spring事務管理](https://so.csdn.net/so/search?qspring事務管理&spm1001.2101.3001.7020)功能1.2、方法不是public類型的1.3、數據源未配置事務管理器1.4、自身調用問題1.5、異常類型錯誤1.6…

《golang設計模式》第三部分·行為型模式-07-觀察者模式(Observer)/發布者—訂閱者模式

文章目錄 1. 概念1.1 角色1.2 類圖 2. 代碼示例2.1 代碼2.2 類圖 1. 概念 觀察者&#xff08;Observer&#xff09;指當目標對象狀態發生變化后&#xff0c;對狀態變化事件進行響應或處理的對象。 1.1 角色 Subject&#xff08;抽象主題&#xff09;&#xff1a; 它可以有多…

微服務實戰系列之Feign

前言 不知不覺&#xff0c;“微服務實戰系列”已完成了六篇&#xff0c;每篇都聚焦一個主題&#xff0c;目的是便于各位盆友能夠快速、全面地接收和消化。 博主從服務注冊到服務監控&#xff0c;從服務路由到服務安全&#xff0c;從身份認證到加密技術均有涉獵。凡此均有關微服…

Java核心知識點整理大全10-筆記

往期快速傳送門&#xff1a; Java核心知識點整理大全-筆記_希斯奎的博客-CSDN博客文章瀏覽閱讀9w次&#xff0c;點贊7次&#xff0c;收藏7次。Java核心知識點整理大全https://blog.csdn.net/lzy302810/article/details/132202699?spm1001.2014.3001.5501 Java核心知識點整理…

【LeetCode刷題】--67.二進制求和

67.二進制求和 方法&#xff1a;模擬計算 class Solution {public String addBinary(String a, String b) {StringBuilder ans new StringBuilder();int carry 0;for(int ia.length()-1,jb.length()-1;i>0||j>0;i--,j--){int sum carry;sum i >0 ? a.charAt(i) …

web:[WUSTCTF2020]樸實無華

題目 點開頁面顯示如下 頁面顯示了一行報錯&#xff1a;Cannot modify header information - headers already sent by (output started at /var/www/html/index.php:3) in /var/www/html/index.php on line 4 意思為不能修改報頭信息-報頭已經發送(輸出開始于/var/www/html/i…

vue3 websocket連接 發送數據

先建一個websocket.js放在項目中&#xff0c;內容如下&#xff1a; var websock null; let rec; //斷線重連后&#xff0c;延遲5秒重新創建WebSocket連接 rec用來存儲延遲請求的代碼 let isConnect false; //連接標識 避免重復連接 let checkMsg "heartbeat"; /…

MySQL與Redis如何保證數據的一致性

文章目錄 MySQL與Redis如何保證數據的一致性&#xff1f;不好的方案1. 先寫 MySQL&#xff0c;再寫 Redis2. 先寫 Redis&#xff0c;再寫 MySQL3. 先刪除 Redis&#xff0c;再寫 MySQL 好的方案4. 先刪除 Redis&#xff0c;再寫 MySQL&#xff0c;再刪除 Redis5. 先寫 MySQL&am…

C# 數據庫封裝

最近有些地方用到c#&#xff0c;研究了一下&#xff0c;也有數據庫方面的操作&#xff0c;那就繼續封裝&#xff0c;自己用起來好用一點。 數據庫連接 using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using Sys…

Leetcode算法系列| 1. 兩數之和(四種解法)

目錄 1.題目2.題解解法一&#xff1a;暴力枚舉解法二&#xff1a;哈希表解法解法三&#xff1a;雙指針(有序狀態)解法四&#xff1a;二分查找(有序狀態) 1.題目 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數…

『RabbitMQ』入門指南(安裝,配置,應用)

前言 RabbitMQ 是在 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09; 協議標準基礎上完整的&#xff0c;可復用的企業消息系統。它遵循 Mozilla Public License 開源協議&#xff0c;采用 Erlang 實現的工業級的消息隊列(MQ)服務器&#xff0c;建立在 Erlang …

產品經理提問常用的ChatGPT通用提示詞模板

如何評估產品市場的潛力和可行性&#xff1f; 如何定義和明確產品的目標用戶和需求&#xff1f; 如何進行競品分析和比較&#xff0c;制定產品的差異化策略&#xff1f; 如何設計產品的功能和特性&#xff0c;滿足用戶需求&#xff1f; 如何制定產品的定價策略和銷售計劃&a…

qml View3D使用介紹

在Qt Quick 3D中,View3D 是一個用于展示 3D 內容的 QML 類型。View3D 允許你將 3D 場景集成到 Qt Quick 2D 用戶界面中,這意味著你可以在傳統的 2D UI 元素(如按鈕、文本和圖像)與 3D 圖形之間無縫地進行整合。 View3D 提供了一個視口,用于渲染 3D 場景。它可以包括多個 …

HTTPS攻擊怎么防御?

HTTPS 簡介 超文本傳輸安全協議&#xff08; HTTPS &#xff09;是一種通過計算機網絡進行安全通信的傳輸協議。HTTPS 經由 HTTP 進行通信&#xff0c;但利用 SSL/TLS 來加密數據包。 HTTPS 開發的主要目的&#xff0c;是提供對網站服務器的身份認證&#xff0c;保護交換數據的…

批量將本地N個英文Html文檔進行中文翻譯-操作篇

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