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(標準輸入)
作為引數
- 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()
函式
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);
atoi/l/f()函式
- 用於把字母數字轉換成整數
- 該函式接受一個字串作為引數,返回相應的整數值。
- atoi()、atol()和atof()函式把字串形式的數字分別轉換成int、long和double型別的數字。
strtol()、strtoul()和strtod()函式把字串形式的數字分別轉換成long、unsigned long和double型別的數字。
格式轉換是按照AXCII表來的,’0’轉換完是48,一定要注意不是0。
使用技巧:
查詢字串並分析時
當比較字串時
- 使用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 截斷為整數 |