C語言筆記

編譯工具(gcc)MinGW
代碼文件以.c結尾
開發工具(windows中vs)linux


頭文件:
#include <stdio.h>windows

#include:將指定文件內容拷貝到此處數組

<>:表示文件位置在編譯器預約義默認的C庫文件的位置
"":表示文件位於當前目錄,若找不到,再去預約義的位置查找緩存


main函數
程序的惟一入口,有且只有一個
格式1:
int main(void){
return 0;
}安全

格式2:
int main(int argc,char* argv) {
return 0
}函數

int:函數返回值,main函數的返回值必須爲int
void:參數,void表示沒有參數工具

 

printf函數
向標準輸出設備輸出信息
佔位符:
%s:字符串
%d:整數
%f:小數(小數點後6位有效數字,%.10f:小數點後10位有效數字,%20f:佔20個字符寬度,右對齊顯示)
%ld:long長整型性能


編譯
gcc 文件 -o 輸出文件名開發工具

windows:-o指定後文件名後跟後綴exe,未指定爲a.exe
linux:-o指定文件名爲指定文件名,未指定爲a.out指針


註釋
單行註釋://
多行註釋:/* */


數據類型
char:字符型(1個字符,1個字節,範圍(-128~127),和「字符」,全部ASCII字符,128個),char[]:字符數組,字符串
int:整數類型(4個字節,範圍-(2的31次方)~2的31次方-1)
long:長整型(8個字節,在32位系統中和int相同,佔用4個字節)
long long:長長整型(8個字節,不區分系統位數)
float:單精度浮點類型(4個字節,分開存儲尾數和指數,1.75E5:1.75乘以10的五次方(尾數:1.75,指數:5),最大精度爲7位有效數字,範圍(-3.4*10^38~3.4*10^38))
double:雙精度浮點類型(8個字節,最大精度爲16位有效數字,範圍(-1.7*10^308~1.7*10^308))

 

scanf的使用
scanf("%d",&name):獲取鍵盤輸入,將值賦值給name,值爲整數類型
注意:若是傳入多個值,將會將多餘的值存放到緩衝區,爲下面的scanf進行賦值
scanf("%d%d",&age1,&age2):同時傳入兩個參數,分別賦值,空格分隔
scanf("%d,%d",&age1,&age2):同時傳入兩個參數,分別賦值,必須以逗號分隔
scanf存在返回值,返回的是成功賦值的個數
char類型的賦值不會跳過空格
定義格式化的scanf輸入:
int age;
char name[32];
scanf("年齡=%d,姓名=%s",&age,&name); //輸入時能夠輸入「姓名=張三,年齡=24」
printf("name=%s,age=%d\n",name,age);
經典錯誤:
char a,b;
scanf("%d",&a); //輸入256,按4個字節存儲,第2個字節保存到b變量中
printf("a=%d,b=%d\n",a,b); //輸出爲a=0,b=1
輸入double類型變量的值,必須使用%lf,不然輸入失敗
輸出double類型變量的值,可使用%lf或者%f,沒有區別
在字符串中的使用
char name[10];
scanf("%s",name); //在接收字符串時,不須要在變量名在加&,緣由是name是數組的變量名
缺點:接收字符串時,遇到空格即中止,不能接收到完整的字符串。建議使用gets。


char數據類型的其它輸入輸出函數
getchar:輸入一個字符,不進行賦值可起到暫停程序的效果
char c;
c = getchar();

putchar:輸出一個字符
char c = 'a';
putchar(c);

getc:輸入一個字符
char c;
c = getc(stdin); //輸入一個字符,指定輸入設備,stdin表示「標準輸入設備」,默認是鍵盤

putc:輸出一個字符
char c = 'b';
putc(c,stdout); //輸出一個字符,指定輸出設備,stdout表示「標準輸出設備」,默認是顯示器

gets:接收字符串(次函數容易形成越界,至關於讀一行,例以下面定義了10的字符長度,應存放9個字符,若賦值超過此長度,便發生越界,會破壞其它數據)
char name[10];
gets(name);

fgets:接收字符串(讀取成功返回字符串,讀取失敗返回NULL)
char name[8];
fgets(name,sizeof(name),stdin); //接收字符串,最多隻接收8-1個字符,從標準輸入接收,若在回車符以前的數據不足指定的字符,會中止讀取,但回車符也會讀取
//sizeof():獲取指定變量所佔用的字節數



字符串
在C語言中,字符串是以「字符串數組」存儲的
字符串結束符:在C語言中,爲了便於存儲字符串,要求在字符串最後一個字符的後面存儲一個0(一個字節),經常使用「\0」表示
例:zq ---> 'z' 'q' '\0'
字符串的定義:
char name[10];
name[0] = 'Z';
name[1] = 'Q';
name[2] = '\0';
等同於:
char name[10] = "ZQ";
自動判斷字符數組的長度,減小浪費內存資源
char name[] = "ZQ";


經常使用的字符串函數(#include <String.h>)
strlen():計算字符串的長度
char name[] = "zhangsan";
int len;
len = strlen(name);
strcpy():字符串拷貝(不安全,可能致使越界)
char name1[] = "Rock";
char name[32];
strcpy(name2,name1); //將字符串name1拷貝到字符串name2,同時拷貝字符串結束符,打印時遇到結束符中止打印
strncpy():字符串拷貝,指定拷貝字符個數(不拷貝結束符,若拷貝源字符串字符個數達不到指定個數,缺的個數補0)
strcat:字符串鏈接
char name1[64] = "河北";
char name2[64] = "廊坊";
strcat(name1,name2);
printf("name1:%s",name1); //河北廊坊
printf("name2:%s",name2); //廊坊
strcmp():字符串比較
strcmp(user,"admin"); //判斷user是否等於admin,相等返回0,user字符串小於"admin"字符串返回負數,大於返回整數,比較根據字符從前日後依次比較,比較ASCII碼值
strncmp():字符串比較(指定比較的位數)
strncmp(user,"admin",strlen("admin")); //僅比較指定位數的字符串字符

數組
定義:int a[8]
賦值:定義時直接賦值:int a[8] = {1,2};({1,2}只能在此種方式使用,不可再下面使用a={1,2})
a[0] = 1;
a[1] = 2;

調用:
printf("第一個元素爲:%d",a[0]);


比較運算符:(返回值:真:1(非0便是真),假:0。注:不可比較字符串,比較的是char、int、float、double)
>
<
>=
<=
!=
==


布爾類型(bool)
在C89種,使用0表示假,使用非0值表示真
在C99開始,使用true表示真,false表示假


邏輯運算符
&&:邏輯與,(條件1 && 條件2)當條件1爲真時,纔去判斷條件2
||:邏輯或,(條件1 || 條件2)當條件1爲真時,再也不判斷條件2,當條件1位假時,纔對條件2進行判斷
!:邏輯非,(!(條件)),當條件中存在變量時,必定要用括號將條件擴起來,錯誤示例(! age >= 30)(age非0即爲真,取反爲假,假爲0,條件爲假)。當條件爲真時,爲假,當條件爲假時,爲真


逗號運算符(優先級低,在賦值時要加括號)
(x = (表達式1,表達式2,表達式3)):依次計算,最右面表達式的值爲表達式的值


三目運算符
條件 ? 表達式1 : 表達式2
條件爲真,值取表達式1
條件爲假,值取表達式2


類型轉換
隱式類型轉換
算術轉換(char、int、long、long long、float、double、)
3 + 1.5 => 3.0 + 1.5
賦值轉換
int x;
x = 3.14; //按int類型轉換
輸出轉換
printf("%c\n",255+50); //按305的二進制最後一個字節爲00110001的十進制49,輸出1
printf("%d",3.14); //錯誤
int類型數據,按照%f格式輸出時,將獲得錯誤的輸出。
float(或double)類型數據,按照%d個數輸出時,將獲得錯誤的輸出

強制類型轉換
printf("%d",(char)257 + 100); //將257強制轉換爲char類型


if判斷語句的使用(條件判斷語句)
形式1:
if(條件判斷){
代碼塊
}
形式2:
if(條件判斷){
代碼塊
}else{
代碼塊
}
形式3:
if(條件判斷){
代碼塊
}else if(條件判斷){
代碼塊
}else{
代碼塊
}

while循環語句的使用
while(條件判斷){
循環體
}


進程休眠
windows:Sleep(1000); //單位毫秒(<windows.h>)
Linux:sleep(1); //單位秒


for循環語句的使用(在循環次數已知的狀況下使用for循環更爲方便)
for(int i=1;i<=5;i++){
循環體
}
注:for循環中的三個表達式中的任意一個或多個均可以省略,但分號不可省略


do-while循環語句的使用(無論條件是否成立都會執行一次)
do{
循環體
}while(條件判斷)


文件操做(#include <stdio.h>)
fopen:打開文件
FILE *fopen( const char *fname, const char *mode );
參數1:fname表示文件名,可包含路徑
參數2:打開方式
返回值:FILE * 文件指針(若打開失敗,返回NULL(0))

fclose:關閉文件(寫操做可能寫到緩衝區中,未寫到文件中,只有執行過fclose或fflush纔會將文本寫到文件中)
fclose(file);

fgetc:從文件中讀取一個字符(讀完文件後返回EOF也就是-1)

fputc:將一個字符寫入文件(寫入成功返回寫入字符,失敗返回EOF)

fgets:從文件中讀取一個字符串
fgets:接收字符串(讀取成功返回字符串,讀取失敗返回NULL)
char name[64];
FILE * file1;
file1 = fopen("文件路徑","r");
fgets(name,sizeof(name),file1); //接收字符串,最多隻接收8-1個字符,從標準輸入接收,若在回車符以前的數據不足指定的字符,會中止讀取,但回車符也會讀取
//sizeof():獲取指定變量所佔用的字節數

fputs:將一個字符串寫入文件

fprintf:往文件中寫入格式化數據
fprintf(file,"姓名:%s\t\t年齡:%d\n",name,age); //向file文件流中寫入格式化的數據

fflush:刷新緩存
fflush(file):將文件緩衝區的數據當即寫入文件
fflush(stdin):清空輸入緩衝區(使用案例:scanf("%d",age);中讀取的是數字類型遇到換行中止,那麼換行符就存在與輸入緩衝區中。而接下來使用scanf時,讀取的第一個字符是換行符)

fscanf:格式化讀取文件中的數據(當讀取成功時,返回實際讀取的數據個數,失敗時,返回EOF)

fwrite:以二進制形式寫數據到文件中去
#include <stdio.h>
int fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
參數1:要寫入的內容(內容的起始地址,變量名)
參數2:每次寫入幾個字節(sizeof(char)等同於1)
參數3:寫入幾回
參數4:寫入到哪一個文件流中

fread:以二進制形式讀取文件中的數據
#include <stdio.h>
int fread( void *buffer, size_t size, size_t num, FILE *stream );
參數1:要讀取到哪一個變量中
參數2:要讀取幾個字節
參數3:要讀取幾回
參數4:從哪一個文件流中讀取

putw:以二進制形式存儲一個整數

getw:以二進制方式讀取一個整數(讀取成功返回值,讀取失敗返回-1,文件中讀取的是-1返回的也是-1,可使用feof進行判斷讀取結束,在使用getw時會將文件結束符也讀取爲-1,多一個值,儘可能使用二者同時判斷(value == -1 && feof(文件流)))

feof:判斷文件是否結束(未結束返回false,結束返回true)

ferror:判斷文件讀寫是否出錯(例如:讀權限打開文件,進行寫操做)

perror:輸出函數的錯誤信息
FILE * file;
file = open("test.txt","r");
if(!file){
printf("文件打開失敗"); //以讀權限打開文件
return 1;
}
fputc("A",file);
if(ferror(file)){
perror("fputc"); //輸出fputc函數的錯誤信息,沒有錯誤不輸出
clearerr(file); //清除錯誤標誌
}

clearerr:清除文件錯誤標誌(在發生錯誤後,即便進行正確的操做,也不會清除錯誤標記,可以使用此函數清除錯誤標誌,不然錯誤標誌一直存在)

ftell:獲取文件指針的當前位置(返回long類型的長整數,單位是字符個數)

文件定位:
fseek:隨機定位
#include <stdio.h>
int fseek( FILE *stream, long offset, int origin );
參數1:文件流
參數2:偏移量,可正可負,>0向文件尾方向偏移,<0向文件頭方向偏移
參數3:SEEK_SET 從文件的開始位置定位,此時參數2必須大於0
SEEK_CUR 從文件的當前位置定位
SEEK_END 從文件的結束位置定位,此時參數2必須小於0

switch語句的使用
switch(n){
case '1': //當n爲1時
{
... //case代碼語句中沒法定義變量,如必定要定義變量,須要在先後使用{}括號,且變量僅生效在{}括號內
break;
}
case '2': //當n爲2時
...
break;
case '3': //當n爲3時
...
break;
default: //當n不爲1/2/3時
...
}

使用或的時候能夠用如下方式
case 1:
case 3:
case 5:
days = 31 //當值爲1/3/5時days賦值31

switch:用於int、char、long、long long類型的變量,和多個特定常量的判斷處理(float和double類型不能夠)
if:適用於各類邏輯判斷

函數: 被調用的函數須要定義在調用者以前,或者在調用者前面聲明 聲明:返回類型 函數名(參數); 遞歸函數斐波那契數列:1,1,2,3,5,8,13,21...(前兩個數字爲1,從第3個數開始爲前兩個數字相加的值) int fib(int n){ int s; if(n == 1||n == 2){ return 1; } s = fib(n - 1) + fib(n - 2); return s; }遞歸函數缺點:性能很低(能不用則不用)

相關文章
相關標籤/搜索