標頭檔案講解

micryfotctf發表於2024-11-15

stdio.h標頭檔案(常用輸入輸出函式)

printf()函式:

把輸出傳送到一個叫作緩衝區(buffer)的中間儲存區域。

  • 當緩衝區滿、遇到換行字元或需要輸入的時候迫使printf()的輸出被髮送到螢幕上。
  • 可以使用fflush()函式重新整理緩衝區
  • printf()返回值是待顯示字元的個數
  • printf()中如果你不想預先指定欄位寬度,希望透過程式來指定,那麼可以用*修飾符代替欄位寬度。但還是要用一個引數告訴函式,欄位寬度應該是多少。也就是說,如果轉換說明是%*d,那麼引數列表中應包含*和 d對應的值。這個技巧也可用於浮點值指定精度和欄位寬度。(%*.*f

scanf()函式:

scanf()函式每次讀取都會跳過所有的空白字元,直至遇到第1個非空白字元才開始讀取。

  • 讀取整數(%d):scanf()希望發現一個數字字元或者一個符號(+或-)。如果遇到一個非數字字元,它便認為讀到了整數的末尾。scanf()把非數字字元放回輸入。意味著程式在下一次讀取輸入時,首先讀到的是上一次讀取丟棄的非數字字元。
  • 讀取字元(%c):讀取單個字元
  • 讀取字串(%s):scanf()會讀取除空白以外的所有字元。意味著只能讀取一個單詞。
    • 無法利用欄位寬度讓只有一個%s的scanf()讀取多個單詞。如果使用欄位寬度,scanf()在欄位末尾或第1個空白字元處停止讀取。
  • 格式字串中的普通字元:scanf()允許把普通字元放在格式字串中。但除空格字元外的普通字元必須與輸入字串嚴格匹配。
    • 假設在兩個轉換說明中加一個逗號:scanf("%d,%d", &n, &m);``scanf()函式將其解釋成:使用者將輸入一個數字、一個逗號,然後再輸入一個數字。也就是說,使用者必須像下面這樣進行輸入兩個整數:
      • 由於格式字串中,%d後面緊跟逗號,所以必須在輸入第一個數後再輸入一個逗號。
  • 對於scanf(),一定要記得在變數名前加上地址運算子。
  • scanf()返回值=scanf()成功讀取的項數。如果沒有讀取任何項,或者需要讀取一個數字而使用者卻輸入一個非數值字串,即型別不匹配scanf()便返回0。
  • scanf()檢測到“檔案結尾”時,會返回EOF(EOF是stdio.h中定義的特殊值,通常用#define指令把EOF定義為-1)。
  • scanf()中如果把*放在%和轉換字元之間時,會使得scanf()跳過相應的輸出項。
    • 示例:scanf("%*d %*d %d", &n);其中的scanf()指示:跳過兩個整數,把第3個整數複製給n。
    • 在程式需要讀取檔案中特定列的內容時,這項跳過功能很有用。
  • scanf()函式檢測到檔案結尾時返回EOF。

getchar()函式:

讀取下一個輸入字元

  • 使用int陣列時getchar只能賦值數字,無法賦值其他字元容易出錯。
  • getchar()和 putchar()不需要轉換說明,因為它們只處理字元。
  • 在C語言中,用getchar()讀取檔案檢測到檔案結尾時將返回EOF
  • getchar()的返回值和EOF作比較。如果兩值不同,就說明沒有到達檔案結尾。
    • 檢測檔案結尾:while ((ch = getchar()) != EOF)
  • 不能把getchar()scanf()這兩個函式混用
    • getchar()讀取每個字元,包括空格、製表符和換行符;
    • scanf()在讀取數字時則會跳過空格、製表符和換行符
    • 以 int 型別讀取字元(這樣做可以檢測 EOF)

putchar()函式:

列印一個字元

gets()函式:

讀取整行輸入,直至遇到換行符,然後丟棄換行符,儲存其餘字元,並在這些字元的末尾新增一個空字元使其成為一個 C字串。

  • 經典用法:gets(words);
    • words是一個char型陣列。如果輸入的字串過長,會導致緩衝區溢位,可能出現問題。
  • 過去通常用fgets()來代替gets(),其在處理輸入方面與gets()略有不同。
  • C11標準新增的gets_s()函式也可代替gets()。該函式與gets()函式更接近,而且可以替換現有程式碼中的gets()。但它是stdio.h輸入/輸出函式系列中的可選擴充套件。

puts()函式:

只用於顯示字串,而且自動在顯示的字串末尾加上換行符

  • 該函式在遇到空字元時就停止輸出,所以必須確保有空字元。

fgets(,,)函式:

  • 第1個引數是陣列,
  • 第2個引數指明瞭讀入字元的最大數量。透過限制讀入的字元數來解決溢位的問題。該函式專門設計用於處理檔案輸入。
    • 如果該引數的值是n,那麼fgets()將讀入n-1個字元,或者讀到遇到的第一個換行符為止。
    • 如果fgets()讀到一個換行符,會把它儲存在字串中。
  • fgets()函式的第3 個引數指明要讀入的檔案。
    • 如果讀入從鍵盤輸入的資料,則以stdin(標準輸入)作為引數
      • 該識別符號定義在stdio.h中。
  • fgets()函式把換行符放在字串的末尾,通常要與 fputs()函式配對使用,除非該函式不在字串末尾新增換行符。
  • 使用迴圈語句fgets()讀不到換行會一直讀,直到讀完一整行,這樣可以某種程度上無視陣列大小的限制。
    • 示例:while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')

fputs(,)函式:

是puts()針對檔案定製的版本。

  • 第2個引數指明要寫入資料的檔案。如果要列印在顯示器上,stdout(標準輸出)作為該引數
  • 不在字串末尾新增換行符
    • 注意,gets()丟棄輸入中的換行符,但是puts()在輸出中新增換行符。
    • 另一方面,fgets()保留輸入中的換行符,fputs()不在輸出中新增換行符。
    • 使用示例:fputs(words, stdout);

gets_s()函式:

fgets()類似,都用一個引數限制讀入的字元數。

  • gets_s()只從標準輸入中讀取資料,所以不需要第3個引數。
  • 如果gets_s()讀到換行符,會丟棄它而不是儲存它。
  • 如果gets_s()讀到最大字元數都沒有讀到換行符,首先會把目標陣列中的首字元設定為空字元,讀取並丟棄隨後的輸入直至讀到換行符或檔案結尾,然後返回空指標。
    • 而fgets()會將它們保留在輸入行。只要輸入行未超過最大字元數,gets_s()和gets()幾乎一樣,完全可以用gets_s()替換gets()。

string.h標頭檔案(字串函式)

C庫提供了多個處理字串的函式,ANSI C把這些函式的原型放在string.h標頭檔案中。要注意的是sprintf()函式,其原型在stdio.h標頭檔案中。

strlen()函式

  • 用於統計字串的長度

strcat()函式

  • 用於拼接字串。
  • 接受兩個字串作為引數
    • 把第2個字串的備份附加在第1個字串末尾
    • 把拼接後形成的新字串作為第1個字串
    • 第2個字串不變。
    • 刪除第一個字串原來末尾的“\0”
  • 該函式返回第1個引數,即拼接第2個字串後的第1個字串的地址。
  • 注意,該函式無法檢查第1個陣列是否能容納第2個字串

strncat()函式

  • 該函式的第3 個引數指定了最大新增字元數

strcmp()函式

  • 用於字串比較。
  • 該函式透過比較運算子來比較字串。如果兩個字串引數相同,該函式就返回0,否則返回非零值。
  • 可以用strcmp()比較儲存在不同大小陣列中的字串。
  • 如果在字母表中第1個字串位於第2個字串前面,就返回負數;反之則返回正數
  • strcmp()比較所有的字元,按機器排序序列進行比較

strncmp()函式

  • 可以比較到字元不同的地方,也可以只比較第3個引數指定的字元數。

stricmp()函式

  • 比較兩個字串忽略大小寫後的大小
  • 返回值和上述相同

strcpy()函式

  • 用於複製整個字串。
  • 相當於字串賦值運算子。
  • 第1個引數不必指向陣列的開始。
  • 第2個引數指向的字串被複製至第1個引數指向的陣列中。
    • 複製出來的字串被稱為目標字串,最初的字串被稱為源字串。
  • 該函式返回型別是 char*,返回的是第 1個引數的值,即一個字元的地址。

strncpy()函式

  • 該函式的第 3 個引數指明可複製的最大字元數。
  • 如果複製到第n個字元時還未複製完整個源字串,就不會複製空字元,此時需要有處理程式。
    • 示例:
strncpy(qwords[i], temp, TARGSIZE - 1);
qwords[i][TARGSIZE - 1] = '\0';//確保儲存的是一個字串。

sprintf()函式

  • 把資料寫入字串,而不是列印在顯示器上。
  • sprintf(,”%”,)
  • 第1個引數是目標字串的地址。其餘引數和printf()相同。

strpbrk()函式

  • 引數都為字串
  • 如果第一個引數中包含第二個引數中的任意字元,返回指向 s1 字串首位置的指標;反之則返回空字元

strchr()函式

  • 第一個引數為字串,第二個引數為字元
  • 如果字串中包含該字元,返回該字元的指標(末尾的空字元也是字串的一部分,所以在查詢範圍內);反之則返回空指標。

strrchr()函式

  • 第一個引數為字串,第二個引數為字元
  • 該函式返回字串中某字元的最後一次出現的位置(末尾的空字元也是字串的一部分,所以在查詢範圍內)。如果未找到c字元,則返回空指標。

strset()函式

  • 第一個引數為字串,第二個引數為字元,第三個引數為數字
  • 將字串簽名n個字元都設為指定字元

strstr()函式

  • 引數都為字串
  • 該函式返回指向第一個引數中第二個引數出現的首位置。如果在第一個引數中沒有找到第二個引數,則返回空指標。

size_t型別

  • 是sizeof運算子返回的型別
  • 宣告示例:size_t strlen(const char * s);
    • 該函式返回s字串中的字元數,不包括末尾的空字元。

atoi/l/f()函式

  • 用於把字母數字轉換成整數
  • 該函式接受一個字串作為引數,返回相應的整數值。
  • atoi()、atol()和atof()函式把字串形式的數字分別轉換成int、long和double型別的數字。

strtol()、strtoul()和strtod()函式把字串形式的數字分別轉換成long、unsigned long和double型別的數字。

格式轉換是按照AXCII表來的,’0’轉換完是48,一定要注意不是0。

使用技巧:

查詢字串並分析時

  • 使用 strcmp()來代替關係運算子

當比較字串時

  • 使用strcpy()或strncpy()代替賦值運算子把字串賦給字元陣列。

Ctype.h標頭檔案

字元測試函式名稱 如果是下列引數,返回值為真
isalnum() 字母或數字
isdigit() 數字
isxdigit() 十六進位制字元
isalpha() 字母
islower() 小寫字母
isupper() 大寫字母
iscntrl() 控制字元,如Ctrl+B
isprint() 可列印字元
isblank() 標準的空白字元(空格、水平製表符或換行符)或任何其他本地化指定為空白的字元
isspace() 空白字元(空格、換行符、回車符、換頁符、垂直製表符、水平製表符或其他本地化定義的字元)
isgraph() 除空格以外的任何可列印字元
ispunct() 標點符號(除空格或字母數字以外的任何可列印字元)
字元對映函式名稱 行為
tolower() 如果引數是大寫字元,該函式返回小寫字元,否則返回原始引數
toupper() 如果引數是小寫字元,該函式返回小大寫字元,否則返回原始引數

stdlib.h標頭檔案

記憶體分配函式 效果
malloc(size_t size) 分配一塊記憶體區域
calloc(size_t num, size_t size) 分配一塊記憶體區域,並初始化為0
realloc(void *ptr, size_t new_size) 改變先前分配的記憶體區域的大小
free(void *ptr) 釋放先前分配的記憶體區域
程式控制函式 效果
exit(int status) 終止當前程式的執行
abort(void) 生成一個異常訊號,導致程式異常終止
system(const char *command) 執行一個命令
轉換函式 效果
atoi(const char *str) 將字串轉換為整數
atol(const char *str) 將字串轉換為長整數
atof(const char *str) 將字串轉換為浮點數
strtol(const char *str, char **endptr, int base) 將字串轉換為長整數
strtod(const char *str, char **endptr) 將字串轉換為雙精度浮點數
隨機數生成函式 效果
rand(void) 生成一個偽隨機數
srand(unsigned int seed) 設定隨機數生成器的種子
搜尋和排序函式 效果
qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *)) 對陣列進行排序
bsearch(const void *key, const void *base, size_t num, size_t size, int (*compar)(const void *, const void *)) 在已排序的陣列中二分查詢
其他實用工具函式 效果
abs(int j) 返回整數的絕對值
labs(long int j) 返回長整數的絕對值
div(int numerator, int denominator) 執行除法運算並返回商和餘數
ldiv(long int numerator, long int denominator) 執行長整數除法運算並返回商和餘數
mbstowcs(wchar_t *restrict pwcs, const char *restrict s, size_t n) 將多位元組字串轉換為寬字元字串
wcstombs(char *restrict s, const wchar_t *restrict pwcs, size_t n) 將寬字元字串轉換為多位元組字串

math.h標頭檔案

常數 含義
M_PI 圓周率 π 的值
M_E 自然對數的底數 e 的值
M_LOG2E log2(e) 的值
M_LOG10E log10(e) 的值
M_LN2 自然對數 ln(2) 的值
M_LN10 自然對數 ln(10) 的值
M_PI_2 π/2 的值
M_PI_4 π/4 的值
M_1_PI 1/π 的值
M_2_PI 2/π 的值
M_2_SQRTPI 2/√π 的值
M_SQRT2 √2 的值
M_SQRT1_2 1/√2 的值
冪函式 效果
pow(x, y) 計算 x 的 y 次冪,返回double型
sqrt(x) 計算 x 的平方根
cbrt(x) 計算 x 的立方根
三角函式 效果
sin(x) 計算 x(以弧度為單位)的正弦值
cos(x) 計算 x(以弧度為單位)的餘弦值
tan(x) 計算 x(以弧度為單位)的正切值
asin(x) 計算 x 的反正弦值
acos(x) 計算 x 的反餘弦值
atan(x) 計算 x 的反正切值
atan2(y, x) 計算 y/x 的反正切值
指數和對數函式 效果
exp(x) 計算 e 的 x 次冪
log(x) 計算 x 的自然對數
log10(x) 計算 x 的以10為底的對數
log2(x) 計算 x 的以2為底的對數
超越函式 效果
sinh(x) 計算 x 的雙曲正弦值
cosh(x) 計算 x 的雙曲餘弦值
tanh(x) 計算 x 的雙曲正切值
其他函式 效果
fabs(x) 計算 x 的絕對值
ceil(x) 計算大於或等於 x 的最小整數
floor(x) 計算小於或等於 x 的最大整數
fmod(x, y) 計算 x 除以 y 的餘數
round(x) 將 x 四捨五入到最近的整數
trunc(x) 將 x 截斷為整數

相關文章