C ( C99 & C11 )
文中的部分函數與頭文件只有 C99 & C11 及更高標准中才能使用, 因此若編譯器支持的 C 語言標准過低 ( 如 vc 6.0, turbo - C 等只支持 C89 標准 ) 請更換能支持更高標准的編譯器 (dev-cpp, visual studio 13及更高版本, gcc, clang等)
字符串處理函數
fgets和fputs
因為 gets 不安全, 所以在一些編譯器中 gets 無法使用. 於是用 fgets 和 fputs 代替
fgets的函數原型 :
char *__cdecl fgets(char *_Buffer, int _MaxCount, FILE *_Stream)
函數參數從左至右依次是 : 指向字符數組的指針, 用來存儲字符串. 字符串的最大長度, 輸入/輸出流
fputs的函數原型 :
int __cdecl fputs(const char *_Buffer, FILE *_Stream)
函數參數從左至右依次是 : 指向字符數組的指針, 輸入/輸出流
#include <stdio.h>
int main(void)
{
char ch[40];
fgets(ch, 40, stdin); /*輸入Hello, World!*/
fputs(ch, stdout); /*輸出Hello, World!, 並在字符串末尾帶上換行符*/
return 0;
}
輸出結果
Hello, World!
scanf 與 fgets :
- fgets 與 scanf 最大的不同就在於 scanf 遇到空白符 (如空格回車等) 就會停止讀取字符. 而 fgets 不會, 它遇到換行符或者已達讀取字符數量數量上限時才會停止讀取.
- 如果fgets讀取的字符數量超過上限, 則超過上限的字符會被保留在緩沖區中
- fgets 會讀取換行符 '\n', 因此這就是為什么 fgets 讀取的字符數量要少 1 個.
下面是一些常用的 C 語言中有關字符串操作相關的函數, 大部分包含於頭文件 <string.h> 中.
strlen()
函數原型 :
size_t strlen(const char *_Str)
顧名思義, 用來返回字符串長度的. 函數參數是 指向字符數組的指針
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[40];
fgets(ch, 40, stdin); /*輸入Hello, World!*/
printf("%d\n", strlen(ch));
return 0;
}
輸出結果
14
strlen 返回的由 fgets 輸入的字符串的字符數時, 一般情況下比實際字符數要多 1, 因為 strlen 會將換行符也讀取進去.
strcat()
函數原型 :
char * strcat(char *_Destination, const char *_Source)
用於拼接字符串, 即將原字符串插入目標字符串的后面. 函數參數從左到右依次是 : 指向目標字符數組的指針, 指向原字符數組的指針. 返回類型是一個 char 指針*.
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[40];
char CH[40];
scanf("%s", ch); /*輸入Hello, */
scanf("%s", CH); /*輸入World!*/
strcat(ch, CH);
printf("%s", ch);
return 0;
}
輸出結果
Hello, World!
strcmp
函數原型 :
int strcmp(const char *_Str1, const char *_Str2)
顧名思義用於比較字符串的長短或者查看兩個字符串是否相等. 其原理是將字符串的字符一一比較 ascii 值大小得到的.
#include <stdio.h>
#include <string.h>
int main(void)
{
char A[40] = "Hello, World!";
char B[40] = "hello, world!";
char C[40] = "Hello, World";
printf("%d\n", strcmp(A, B));
printf("%d\n", strcmp(A, C));
printf("%d\n", strcmp(A, A));
return 0;
}
輸出結果
-1
1
0
一般來說如果返回值為正, 則字符串一 \(>\) 字符串二, 等於 1 則說明兩個字符串相等, 為負則說明字符串一 \(<\) 字符串二
strcpy()
函數原型 :
char * strcpy(char *_Destination, const char *_Source)
顧名思義用於復制字符串, 將原字符串覆蓋目標字符串. 函數參數從左至右依次是 指向目標字符數組的指針, 指向原字符數組的指針.
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[40] = "Hello, World!";
char CH[40] = "World!";
strcpy(ch, CH);
printf("%s\n", ch);
return 0;
}
輸出結果
World!
或者是覆蓋某一部分, 不用全覆蓋
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[40] = "Hello, World!";
char CH[40] = "World!";
strcpy(ch + 3, CH);
printf("%s\n", ch);
return 0;
}
輸出結果
HelWorld!
內存管理函數
C語言中最常用的就是 malloc 和 free 函數了, 這兩個函數包含於頭文件 <malloc.h> 或者 <stdlib.h> 中.
malloc()和free()
函數原型 :
void * malloc(size_t _Size)
malloc 向內存申請一塊空間, 大小為 _Size, 並返回一個指向該空間的地址. 指針類型和內存大小由程序員自行定義.
#include <stdio.h>
#include <stdlib.h>
typedef struct LinkNode
{
int data;
struct LinkNode *next;
} LinkNode;
int main(void)
{
LinkNode *List = (LinkNode *)malloc(sizeof(LinkNode));
List->data = 1;
List->next = (LinkNode *)malloc(sizeof(LinkNode));
return 0;
}
free()函數用於釋放內存, 只需向函數傳遞已經通過 malloc 分配空間的指針即可.
函數原型 :
void free(void *_Block)
數學函數
C語言中提供了許多數學函數, 它們大多包含在頭文件 <math.h> 中
fabs()
函數原型 :
double fabs(double _X)
常用於對 double 類型的變量取絕對值, 返回值的類型為 double.
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = -3.14159;
printf("%lf\n", abs(x));
return 0;
}
輸出結果
3.141590
floor()和ceil
floor()
函數原型 :
double floor(double _X)
用來對 double 變量向下取整
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = 3.14159;
printf("%lf\n", floor(x));
return 0;
}
輸出結果
3.000000
ceil()
函數原型 :
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = 3.14159;
printf("%lf\n", ceil(x));
return 0;
}
用來對 double 變量向上取整
輸出結果
4.000000
pow()
函數原型 :
double pow(double _X, double _Y)
用來求 double 變量的冪, 函數參數從左至右依次為 : 底數, 指數
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = 3.14159;
printf("%lf\n", pow(x, 3));
return 0;
}
輸出結果
31.006198
sqrt()
函數原型 :
double sqrt(double _X)
用於求 double 變量的平方根
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = 4.00;
printf("%lf\n", sqrt(x));
return 0;
}
輸出結果
2.000000
cbert()
函數原型 :
double cbrt(double _X)
用來求 double 變量的立方根
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = 27.00;
printf("%lf\n", cbrt(x));
return 0;
}
輸出結果
3.000000
log()
函數原型 :
double __cdecl log(double _X)
用於求 double 變量以自然對數為底的對數
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf\n", log(1));
return 0;
}
輸出結果
0.000000
log10()
函數原型 :
double __cdecl log10(double _X)
用於求 double 變量的以10為底的對數
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf\n", log10(10));
return 0;
}
輸出結果
1.000000
exp()
函數原型 :
double exp(double _X)
用來求以e為底的冪
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf\n", exp(1));
return 0;
}
輸出結果
2.718282
sin()和asin()
sin()
函數原型 :
double sin(double _X)
用於計算正弦值
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf", sin(1.5707963)); /*1.5707963 即 π/2*/
return 0;
}
輸出結果
1.000000
asin()
函數原型 :
double asin(double _X)
用於計算反正弦值
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf", asin(1));
return 0;
}
輸出結果
1.570796
cos()和acos()
cos()
函數原型 :
double cos(double _X)
用於計算余弦值
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf", cos(1));
return 0;
}
輸出結果
0.540302
acos()
函數原型 :
double __cdecl acos(double _X)
用於計算反余弦值
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf", acos(0.5));
return 0;
}
輸出結果
1.047198
tan()和atan()
tan()
函數原型 :
double __cdecl tan(double _X)
用於計算正切值
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf", tan(3.1415926 / 3));
return 0;
}
輸出結果
1.732051
atan()
函數原型 :
double __cdecl atan(double _X)
用於計算反正切值
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf", atan(3.1415926));
return 0;
}
輸出結果
1.262627
round()
函數原型 :
double round(double _X)
用於對浮點數進行四舍五入
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%lf", round(4.5));
return 0;
}
輸出結果
5.000000
其他函數
stdlib.h
atof()
函數原型 :
double atof(const char *_String)
主要用於將字符串中的數字轉化為為 double 浮點值, 讀取時遇到空白符會跳過, 遇到非數字字符會直接結束轉換
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char A[10] = "1.2345";
char B[10] = " 1.2345";
char C[10] = "1.23a45";
printf("%lf\n", atof(A));
printf("%lf\n", atof(B));
printf("%lf\n", atof(C));
return 0;
}
輸出結果
1.234500
1.234500
1.230000
atoi
函數原型 :
int __cdecl atoi(const char *_String)
主要用於將字符串中的數字轉化為 int 值, 讀取時遇到空白符會跳過, 遇到非數字字符會直接結束轉換
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char A[10] = "1234";
char B[10] = " 1234";
char C[10] = "1.23a4";
printf("%d\n", atoi(A));
printf("%d\n", atoi(B));
printf("%d\n", atoi(C));
return 0;
}
輸出結果
1234
1234
1
atol()
函數原型 :
long __cdecl atol(const char *_String)
主要用於將字符串中的數字轉化為 long 值, 讀取遇到空白符會跳過, 遇到非數字字符會直接結束轉換
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char A[10] = "1234";
char B[10] = " 1234";
char C[10] = "1.23a4";
printf("%ld\n", atol(A));
printf("%ld\n", atol(B));
printf("%ld\n", atol(C));
return 0;
}
輸出結果
1234
1234
1
rand()
函數原型 :
int rand(void)
顧名思義, 它主要用來輸出隨機數的, 大多配合循環或遞歸使用
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
for (int i = 0; i < 5; i++)
{
int x = rand();
printf("%d\n", x);
}
return 0;
}
輸出結果
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
for (int i = 0; i < 5; i++)
{
int x = rand();
printf("%d\n", x);
}
return 0;
}
abs()
函數原型 :
long long abs(const long long _X)
主要用來求整數的絕對值, 返回類型和函數參數類型都為 long long.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("%ld\n", abs(-12345));
return 0;
}
輸出結果
12345
ctype.h
判斷字符串中的字符函數
函數 | 描述 |
---|---|
isalnum() | 是否為字母數字 |
isalpha() | 是否為字母 |
islower() | 是否為小寫字母 |
isupper() | 是否為大寫字母 |
isdigit() | 是否為數字 |
isxdigit() | 是否為16進制數字 |
iscntrl() | 是否為控制字符 |
isgraph() | 是否為圖形字符(例如,空格、控制字符都不是) |
isspace() | 是否為空格字符(包括制表符、回車符、換行符等) |
isblank() | 是否為空白字符([C99]/[C11]新增)(包括水平制表符) |
isprint() | 是否為可打印字符 |
ispunct() | 是否為標點 |
tolower() | 轉換為小寫 |
toupper() | 轉換為大寫 |
stdbool.h
宏名稱 | 展開 |
---|---|
bool | _Bool |
true | 整數常量1 |
false | 整數常量0 |
__bool_true_false_are_defined | 整數常量1 |