C語言程序結(jié)構(gòu)
gcc -v編譯環(huán)境
- cmd中g(shù)cc 文件名.c編譯生成.exe文件
Hello World
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world!¥n");
return 0;
}
- 注釋
// 單行注釋
/*多行注釋*/
#include <stdio.h>
main()方法
- 每個(gè)獨(dú)立的C程序必須要有main()方法,這是C程序執(zhí)行的起點(diǎn)。
- int main()
{
代碼體;
return 0;
}
- error時(shí)return 1;
IO交互
- 輸入(input)
//scanf()方法
int age;
printf("Enter you age :");
scanf("%d", &age);
- &:指針,變量指定長度后可以不加&符號(hào)
- age:如果字符串中有空格,會(huì)發(fā)生截位
- 可以用多個(gè)變量接收space前后內(nèi)容
- scanf("%d");
- 讀取數(shù)據(jù)后再scanf可以清空input buffer
printf("You age is %d" ,age);
//fgets()方法
char name [20];
printf("Enter you name :");
fget(name, 20, stdin);
- 變量,長度,標(biāo)準(zhǔn)輸入
- 會(huì)忽視字符串中的空格,顯示一整行內(nèi)容
printf("You name is %s", name);
- fget時(shí),%s后面會(huì)換行
- name[strlen(name) - 1] ~ '¥0';不換行
- 輸出(output)
printf("內(nèi)容1¥n內(nèi)容2")
- 換行
- 格式化字符
- %s,d,c,lf占位符,和python用法一樣
- %.2f表示只要兩位小數(shù)
printf("%s"), "hello world"
printf("%p", &變量) // 打印變量的指針地址
命令的結(jié)尾
- C程序內(nèi)每條命令的結(jié)尾是分號(hào)“;”
數(shù)據(jù)類型
-
常量:
- const int num = 5;
-
字符型
- char grade = 'A'; 1byte -128 ~+127
- char name[長度] = "allen";
- unsigned char = 255;1byte 0-255
-
整型
- int age = 18; 4byte
- unsigned int = 4294967295L;4byte
- short int = 32767;2byte
- unsigned short int = 65535;2byte
- float price = 3.5;4byte
- double height = 1.83;8byte
-
布爾型
- bool flag = true;1byte
-
數(shù)組:Array
- int nums[長度] = {2, 4, 5, 8};
- printf("%d", nums[1]); // 結(jié)果:4,index從0開始計(jì)算
- 數(shù)組長度
- sizeof(數(shù)組)
- 長度單位為byte字節(jié)數(shù),需整除換算
- strlen(數(shù)組)
- 字符型數(shù)組長度
- sizeof(數(shù)組)
- 二維數(shù)組
- int nums [2] [3] = {{1,2,3}, {4,5,6}} // 2行3列
- 字符型數(shù)組不能直接=賦值
- 可以用strcpy函數(shù)更新字符串的值
結(jié)構(gòu)體:struct
struct 結(jié)構(gòu)體名
{
子屬性1;
子屬性2;
};
struct Player
{
char name[12] ;
int age;
}
// 創(chuàng)建自定義實(shí)例
// struct 結(jié)構(gòu)體名 實(shí)例名;
struct Player player1;
- 引用自定義類型
- 結(jié)構(gòu)體名.子屬性
Player.name
// 結(jié)構(gòu)體很像面向?qū)ο蟮念?,但是沒有方法,只有屬性
自定義:typedef
// 用于給已存在的數(shù)據(jù)類型起別名
typedef struct
{
char name[25];
char pwd[12];
int id;
} User
User user1 = {"allen", "password", 00123} // 創(chuàng)建user1實(shí)例,User可看作數(shù)據(jù)類型
枚舉:enum
// enum 變量{值1,值2...} // enum是自定義的int型
enum Day{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
- sun = 1,...sat = 7
enum Day today = Sun; // 結(jié)果為1
- enum目的是增加可讀性
運(yùn)算符與表達(dá)式
-
單元運(yùn)算符
只需要一個(gè)運(yùn)算符就可以運(yùn)算,這類運(yùn)算符稱為單元運(yùn)算符
- 自增i++,先運(yùn)算后加
- 自增++i,先加后運(yùn)算
- 自減i--,先運(yùn)算后減
- 自減--I,先減后運(yùn)算
二元運(yùn)算符
需要有兩個(gè)運(yùn)算符才可以運(yùn)算的符號(hào)稱為二元運(yùn)算符
賦值運(yùn)算符
變量1 = 變量2 // 變量2賦值給變量1
變量1 == 變量2 // 不是賦值是比較,判斷變量2是否等于變量1算數(shù)運(yùn)算符
加法(+) // 復(fù)合運(yùn)算為:+=
減法(-) // 復(fù)合運(yùn)算為:-=
乘法(*) // 復(fù)合運(yùn)算為:*=
除法(/) // 取商,復(fù)合運(yùn)算為:/=
求余(%) // 取余,復(fù)合運(yùn)算為:%=比較運(yùn)算符
大于(>)
小于(<)
大于等于(>=)
小于等于(<=)
等于(==)
不等于(!=) // !也叫反向運(yùn)算符邏輯運(yùn)算符
或(&&):a&&b,a和b都false才false,否則true
與(||):a||b,a和b都true才true,否則false
非(!): !a,結(jié)果和a的結(jié)果正好相反
異或(^):a^b,a和b結(jié)果不同則true,相同為false
- 位運(yùn)算
// &(and)或
int x = 6; // x=00000110
int y = 12; // y=00001100
int z = 0; // z=00000100
/*
0 : 0 = 0
1 : 1 = 1
0 : 1 = 0
1: 0 = 0
*/
// 結(jié)果為and兩邊相等的值
// |(or)與
int x = 6; // x=00000110
int y = 12; // y=00001100
int z = 14; // z=00001110
/*
0 : 0 = 0
1 : 1 = 1
0 : 1 = 1
1: 0 = 1
*/
// 結(jié)果為or一邊為1則為1
// ^(XOR)非
int x = 6; // x=00000110
int y = 12; // y=00001100
int z = 10; // z=00001010
/*
0 : 0 = 0
1 : 1 = 0
0 : 1 = 1
1 : 0 = 1
*/
// 結(jié)果為兩邊不同則為1
// <<(left shift)左移
// x=00000110
z = x << 1;
// z = 00001100
- 往左移動(dòng)一位,末尾補(bǔ)0,z = 12
z = x << 2;
// z = 00011000
- 往左移動(dòng)2位,末尾補(bǔ)00,z = 24
// >>(right shift)右移
// x=00000110
z = x >> 1;
// z = 00000011
- 往右移動(dòng)一位,開頭補(bǔ)0,末尾去0,z = 3
z = x >> 2;
// z = 00000001
- 往右移動(dòng)2位,開頭補(bǔ)0,末尾去1,z = 1
三元運(yùn)算符
需要三個(gè)運(yùn)算符進(jìn)行運(yùn)算,這類運(yùn)算符稱為三元運(yùn)算符
表達(dá)式? X:Y // true則返回X,false則返回Y
例如:a>b? a:b;
流程控制
-
分支
// if語句
if(條件1) {
真代碼1;
}else if(條件2){
真代碼2
}else{
假代碼;
}
// switch語句
switch(表達(dá)式){
case 值1:
代碼1;
break;
case 值2:
代碼2;
break;
default:
代碼n
}
default不用break跳出語句
-
循環(huán)
// for循環(huán)
for(初始化計(jì)數(shù)器;循環(huán)條件;自增減){}
for(int i = 1; i <=10; i ++)
{
循環(huán)體;
}
// while循環(huán)
while(條件){循環(huán)體}
while(i < 10)
{
printf(i);
i++;
}
// do while循環(huán)
do{
循環(huán)體;
}while(條件);
- 先執(zhí)行一遍循環(huán)體,在判斷是否繼續(xù)循環(huán)
跳出語句
- continue
- 跳過本次循環(huán)
- break
- 跳出循環(huán)體
函數(shù)
-
內(nèi)置函數(shù)
//string.h
- strlwr(變量) // 轉(zhuǎn)小寫
- strupr(變量) //轉(zhuǎn)大寫
- strcat(變量1,變量2) // 合并字符串
- strncat(變量1,變量2,長度) // 把變量2的指定長度字符合并在變量1后面
- strcpy(變量1,變量2) // 把變量1替換為變量2
- strncpy(變量1,變量2,長度) //把變量2指定長度字符替換變量1對(duì)應(yīng)長度內(nèi)容
- strset(變量,'?') // 把變量全替換成?問號(hào)
- strnset(變量,'?', 1) // 把變量第1位替換成?問號(hào)
- strrev(變量) // 把字符串內(nèi)容反過來
- strlen(變量) // 字符串長度
- strcmp(變量1,變量2) // 變量1等于變量2,則返回0,否則不等于0
// math.h
// ctype.h
// time.h
// stdbool.h 引用布爾值
- toupper(變量):轉(zhuǎn)大寫
- rand():隨機(jī)數(shù)
- 函數(shù)在time.h下
- srand(time(0)); // 控制時(shí)間,沒有這句則無法隨機(jī),而是固定數(shù)
int num = (rand( )% 6) + 1; // 1-6之間的隨機(jī)數(shù)
-
自定義函數(shù)
/*
類型 函數(shù)名()
{
函數(shù)體;
}
*/
- 在main()函數(shù)調(diào)用
- 函數(shù)名()即可調(diào)用
void hello()
{
printf("hello");
}
int main()
{
hello();
}
// 傳參
- 實(shí)參
- 主方法調(diào)用函數(shù)時(shí)傳遞的值
- 編譯時(shí)不會(huì)檢查傳遞參數(shù)個(gè)數(shù),即使錯(cuò)了也會(huì)繼續(xù)編譯
- 形參
- 接收傳遞的值,參數(shù)類型個(gè)數(shù)要一致
- 變量名可以與實(shí)參不相同
- return語句
- 返回函數(shù)的結(jié)果給調(diào)用的地方
- return的數(shù)據(jù)類型要和本身函數(shù)的類型相同
- 也可以return表達(dá)式
- 建議
- 建議把main函數(shù)放在最頂端,可在main函數(shù)上面加自定義函數(shù)原型
void hello(char [], int);
- 自定義函數(shù)原型
int main(){}
- main函數(shù)
void hello(char name[], int age){}
- 自定義函數(shù)
指針
int age = 21;
int pAge = &age;
printf("address : %p", &age);
- &:地址操作符
- pAge:指針
- 小寫p加變量首字母大寫Age
- %p:指針point
- 指針地址和內(nèi)存地址相同
- 變量age與指針*pAge值相同,類型也要求相同
- age=21的size是4byte,但是指針大小是8byte // 21是兩個(gè)int整數(shù)
// 指針的初始化
int *pAge = NULL; // 初始化成空指針
pAge = &age;
文件操作
FILE *pF = fopen("test.txt", "w");
- *pF:文件指針
- test.txt:文件位置
- w:寫操作(覆蓋)
- a:追加(不會(huì)覆蓋)
- r:只讀
- 讀取文件時(shí)要加buffer
char buffer [255];
while(fgets(buffer, 255, pF) != NULL)
{
printf("%s", buffer);
}
- 沒有循環(huán)則只讀一行內(nèi)容
- 空指針則表示文件不存在
fprintf(pF, "hello world");
- 根據(jù)指針寫文本內(nèi)容
fclose(pF); // 關(guān)閉文件
remove("test.txt") // 刪除文件,0表示刪除成功