C語言學習

? ? 1、標識符

? ? 在C語言中,符號常量,變量,數(shù)組,函數(shù)等都需要一定的名稱,我們把這種名稱成為標識符

? ? 標識符劃分:關鍵字,預定義標識符和用戶標識符

? ? 2、標識符命名原則

? ? 命名規(guī)則:

? ? 1、只能由字母、數(shù)字、下劃線或者美元符號($)組成

? ? 2、不能以數(shù)字開頭D3、不能與關鍵字重名4、嚴格區(qū)分大小寫

? 3、一般不能包括中文字體


3、C語言中的注釋:

注釋的內容就是在程序進行編譯時,讓編譯器無視掉注釋的內容。作用是用來方便程

序員閱讀源代碼的功能,說明某段代碼的意思,或者做其他筆記

C語言有兩種注釋:

功能://符號右邊的一行內容被編譯器忽略(按了回車才算換行)

快捷鍵:Command + /(對應window鍵盤中的window鍵)

1、單行注釋://注釋的內容

功能:/* */符號里面的所有內容都被編譯器忽略

2、多行注釋:/* 注釋的內容 */


4.C語言中字符和位數(shù)。

ch = getchar( )? ? 這表示的是從鍵盤上輸入一個字符,不需要再按enter鍵。當然也可以用scanf 函數(shù),,,字符的話要用%C。

字符可以做加減,這就相當于他們的as碼值做加減,然后輸出,對應的字符。

還有關于對齊的問題:

用一個浮點數(shù)的例子在說明

printf("%.2f\n");? ? ? 這個是一個浮點數(shù)保留2位小數(shù)

printf("%8f%8f\n");? ? 這個就是表示2個浮點數(shù)都占8位,并且是右對齊,當然在8前面加一個負號就是左對齊了,需要注意的不能寫成這樣:printf("%8f %8f\n"); 中間不能加空格,不然就會多一行

printf("%8.2f%8.2f\n"); 這個表示的是為每個數(shù)占8位,并且保留2位小數(shù),這個也是右對齊。

第三章.分支結構

一. 一個語句中可以只有if,這樣的話,如果成立則執(zhí)行下面的內容否則直接把if語句跳過。

C語言中控制分支結構的主要是if語句和switch語句。首先說說if語句:

if語句的單分支結構形式:if(條件 e) { 語句 s; }。當條件e滿足時,則執(zhí)行花括號中的語句s。注(當花括號中只是單語句,即只有一條語句時,花括號可以省略,當然也可以不省略)。但如果是多個語錄必須加花括號,不然運行結果不對,這時編譯器是檢測不出來的。

if語句的雙分支結構形式:if(條件 e) { 語句 s1; } else { 語句s2; } 。當條件e滿足時,則執(zhí)行語句s1,當條件不滿足時則執(zhí)行else分支下的語句s2;

if語句的多分支結構形式:if(條件 1) { 語句 1; } elseif(條件 2) { 語句 2; } elseif(條件 3) { 語句 3; } ……elseif(條件 n) { 語句 n; } else { 語句 n+1; }

這里的多分支條件語句的含義是:如果條件1成立,則執(zhí)行語句1;否則,如果條件2成立,則執(zhí)行語句2;…… 否則,如果條件n成立,則執(zhí)行語句n,

否則,如果前面的條件都不成立,則執(zhí)行 else 分支下的語句n+1;

if還有嵌套結構







第七章:字符數(shù)組與字符串

字符轉義序列:

轉義字\ b \ f \ n \ r \ v \ t都是常用的輸出設備控制字符

換頁符\ f:把活躍位置移到下一頁的開始處

換行符\ n:把活躍位置移動下一行的開始處

回車符\ r:把活躍位置移到當前行的開始處

水平制表符\ t:把活躍位置移到下一個水平制表點(一般是第1,9,17,25等位置處)

垂直制表符\ v:把活躍位置移到下一個垂直制表點

退格符\b:向后退一個活躍位置

數(shù)字轉義序列:

1. 八進制轉義字符(被看作是一個八進制整數(shù),且是有符號整數(shù)(-128~127)(補碼存儲)??!若超過8位如\601('\201'打印整數(shù)為-127),要么發(fā)生截斷要么編譯錯誤!!跟編譯器有關)

它是由反斜杠'\'和隨后的1~3個八進制數(shù)字構成的字符序列。例如,'\60'、'\101'、'\141'分別表示字符'0'、'A'和'a'。因為字符'0'、'A'和'a'的ASCII碼的八進制值分別為60、101和141。

字符集中的所有字符都可以用八進制轉義字符表示。如果你愿意,可以在八進制數(shù)字前面加上一個0來表示八進制轉移字符。

2. 十六進制轉義字符

它是由反斜杠'\'和字母x(或X)及隨后的1~2個十六進制數(shù)字構成的字符序列。例如,'\x30'、'\x41'、'\X61'分別表示字符'0'、'A'和'a'。因為字符'0'、'A'和'a'的ASCII碼的十六進制值分別為0x30、0x41和0x61。

C語言中:

1 用scanf進行輸入

int main( )

{char? a[100];

scanf("%s",&a);

printf("%s\n",a);

return 0;

}

//用scanf進行輸入,在輸入時遇到空格' ',就會認為輸入結束。所以用scanf輸入的數(shù)據(jù)中不能有空白字符。

2? 用gets進行輸入

int main( )

{char a[100];

gets(a);

puts(a);

return 0;

}

與scanf不用的是,用gets進行輸入時,遇到空格符不會結束,知道遇到回車符結束。a可以為字符串數(shù)組名也可以為字符串指針。

區(qū)別與聯(lián)系:

gets(s)函數(shù)與 scanf("%s",&s) 相似,但不完全相同,使用scanf("%s",&s) 函數(shù)輸入字符串時存在一個問題,就是如果輸入了空格會認為字符串結束,空格后的字符將作為下一個輸入項處理,但gets()函數(shù)將接收輸入的整個字符串直到遇到換行為止。

1.scanf()

所在頭文件:stdio.h

語法:scanf("格式控制字符串",變量地址列表);

接受字符串時:scanf("%s",字符數(shù)組名或指針);

2.gets()

所在頭文件:stdio.h

語法:gets(字符數(shù)組名或指針);

兩者在接受字符串時:

1.不同點:

scanf不能接受空格、制表符Tab、回車等;

而gets能夠接受空格、制表符Tab和回車等;

2.相同點:

字符串接受結束后自動加'\0'。

stdio.h中的字符串函數(shù):

sscanf函數(shù)

函數(shù)原型

int sscanf(const char *s,const char *format,..);

int scanf(const char *format,...);


sscanf與scanf類似,都是用于輸入的,只是后者以鍵盤(stdin)為輸入源,前者以固定字符串為輸入源。

參數(shù)列表

buffer存儲的數(shù)據(jù)

format格式控制字符串

argument 選擇性設定字符串

返回值

成功則返回參數(shù)數(shù)目,失敗則返回-1,錯誤原因存于errno中。

操作

1? * 亦可用于格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數(shù)據(jù)不讀入. (也就是不把此數(shù)據(jù)讀入?yún)?shù)中)

2 {a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。

3 width表示讀取寬度。

4 {h | l | I64 | L}:參數(shù)的size,通常h表示單字節(jié)size,I表示2字節(jié) size,L表示4字節(jié)size(double例外),l64表示8字節(jié)size。

5 type :這就很多了,就是%s,%d之類。

6 特別的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目標參數(shù)中寫入值。失敗返回0 ,否則返回格式化的參數(shù)個數(shù)

7 支持集合操作

? %[a-z] 表示匹配a到z中任意字符,貪婪性(盡可能多的匹配)

? %[aB'] 匹配a、B、'中一員,貪婪性

? %[^a] 匹配非a的任意字符,并且停止讀入,貪婪性

使用實例

1 %*d,%*s:*號表示此數(shù)據(jù)不讀入,忽略掉。

ch="MemTotal:? ? ? ? 2028248 kB"

sscanf(ch,"%*s%d",&total);

printf("%d\n",total);

輸出結果:2028248

2 取指定長度的字符串,,不帶數(shù)字的,代表整體賦值。

sscanf("123456 ", "%4s", buf);

printf("%s\n", buf);

輸出結果:1234

3 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。

sscanf("123456 abcdedf", "%[^ ]", buf);

printf("%s\n", buf);

結果為:123456

4 sscanf(ch,"%*[^e]%[^2]",ch1);

尋找e到2之間的數(shù),包括e但不包括2

如果中間有空格,包括空格。

5 給定一個字符串““hello, world”,僅保留world。(注意:“,”之后有一空格)

sscanf(“hello, world”, "%*s%s", buf);

printf("%s\n", buf);

結果為:world

%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了

如果沒有空格則結果為NULL。

6 分割字符串

sscanf("2006:03:18", "%d:%d:%d", a, b, c);

sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);


如果2006:03:18 - 2006:04:18間沒有空格

sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

sprintf

函數(shù)原型

int sprintf( char *buffer, const char *format, [ argument] … );

extern int printf(const char *format,...);


函數(shù)printf根據(jù)指定的格式將參數(shù)輸出到屏幕上;

函數(shù)sprintf根據(jù)指定的格式將參數(shù)輸出到由指針buffer指定的字符數(shù)組(字符緩沖區(qū))中;

參數(shù)列表

buffer:char型指針,指向將要寫入的字符串的緩沖區(qū)。

format:格式化字符串。

[argument]...:可選參數(shù),可以是任何類型的數(shù)據(jù)。

返回值

返回寫入buffer 的字符數(shù),出錯則返回-1. 如果 buffer 或 format 是空指針,且不出錯而繼續(xù),函數(shù)將返回-1,并且 errno 會被設置為 EINVAL。

sprintf 返回被寫入buffer 的字節(jié)數(shù),結束字符‘\0’不計入內。即,如果“Hello”被寫入空間足夠大的buffer后,函數(shù)sprintf 返回5。

格式符

sprintf格式的規(guī)格如下所示。[]中的部分是可選的。

%[指定參數(shù)][標識符][寬度][.精度]指示符

若想輸出'%'本身時, 請使用'%%'處理。

1. 處理字符方向。負號時表示從后向前處理。

2. 填空字元。 0 的話表示空格填 0;空格是內定值,表示空格就放著。

3. 字符總寬度。為最小寬度。

4. 精確度。指在小數(shù)點后的浮點數(shù)位數(shù)。

使用實例

1 把整數(shù)123 打印成一個字符串保存在s 中。

sprintf(s, "%d", 123); //產生"123"

2 按16進制以小寫符號輸出最小為8位的字符串

sprintf(s, "%08X", 4567); //產生:"000011D7"

3 char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};

? char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};

sprintf(s, "%.7s%.7s", a1, a2);//產生:"ABCDEFGHIJKLMN"

這可以類比打印浮點數(shù)的”%m.nf”,在”%m.ns”中,m 表示占用寬度(字符串長度不足時補空格,超出了則按照實際寬度打印),n 才表示從相應的字符串中最多取用的字符數(shù)。通常在打印字符串時m 沒什么大用,還是點號后面的n 用的多。自然,也可以前后都只取部分字符:

sprintf(s, "%.6s%.5s", a1, a2);//產生:"ABCDEFHIJKL"


sprintf(s, "%.*s%.*s", 7, a1, 7, a2);

或者:

sprintf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);

4 實際上,前面介紹的打印字符、整數(shù)、浮點數(shù)等都可以動態(tài)指定那些常量值,比如:

sprintf(s, "%-*d", 4, 'A'); //產生"65 "

sprintf(s, "%#0*X", 8, 128); //產生"0X000080","#"產生0X

sprintf(s, "%*.*f", 10, 2, 3.1415926); //產生" 3.14"

5 sprintf(s, "%p", &i);//這里的P代表的地址,在printf中,如果是打印地址,也要用@。

6 strlen 便已經(jīng)知道了結果字符串的長度。如:

int len = sprintf(s, "%d", i);

對于正整數(shù)來說,len 便等于整數(shù)i 的10 進制位數(shù)。

常用的字符串處理函數(shù)

? ? C語言編譯系統(tǒng)中提供了很多有關字符串處理的庫函數(shù),這些庫函數(shù)為字符串處理提供了方便,下面總結下幾種有關字符串處理的函數(shù)。

一、輸出字符串函數(shù)puts:

格式:puts(字符數(shù)組名) ;

功能:puts函數(shù)用于輸出一個以"\0"結尾的字符串,在輸出時將"\0"轉換為"\n",且輸出的字符串中可以包含轉義字符。

? ? ? 使用puts函數(shù)輸出字符串時,需要使用#include命令將"stdio.h"頭文件包含到源文件中。

二、輸入字符串函數(shù)gets:

格式:gets(字符數(shù)組名);

功能:gets函數(shù)用于將輸入的字符串內容存放到指定的字符數(shù)組中。

? ? ? 使用gets函數(shù)輸入字符串時,需要使用#include命令將"stdio.h"頭文件包含到源文件中。

在使用gets函數(shù)和puts函數(shù)時只能輸入或輸出一個字符串,不能寫成puts(str1,str2)或gets(str1,str2)


三、字符串復制函數(shù)strcpy:

格式:strcpy(字符數(shù)組名,字符串名);

? ? ? ? ? strcpy(字符數(shù)組名1,字符數(shù)組名2);

功能:將字符串內容復制到字符數(shù)組中。

注意:若將字符串或字符數(shù)組2前面的若干個字符復制到字符數(shù)組1中,則應用strncpy函數(shù),其格式為:strncpy(字符數(shù)組,字符串,字符個數(shù));或strncpy(字符數(shù)組1,字符數(shù)組2,字符個數(shù));

static char str2[]=["How are you?"];

char str1[20];

strncpy(str1,str2,3);

.....

....

char str[20];

strncpy(str,"computer",3);

....




四、字符串比較函數(shù)strcmp:

格式:strcmp(字符串名1,字符串名2);

功能:將兩個字符串的對應字符自左至右逐個進行比較(按照ASCII碼值的大?。?,直到出現(xiàn)不同字符或遇到“\0”字符為止。比較結果由函數(shù)值帶回。

說明:1、字符數(shù)組1必須足夠長,以便容納字符數(shù)組2中的全部內容,即:

static char str1[20]="Happy ";

static char str2[10]="New Year!";

strcat(str1,str2);

2、在連接前兩個字符串后面都有一個'\0',連接時將字符數(shù)組1后面的"\0"去掉,只在新字符串后面保留一個"\0";

3、使用strcat函數(shù)連接兩個字符串時,應使用#include命令將"string.h"頭文件包含到源文件中;

4、strcat函數(shù)的返回值是字符數(shù)組1的地址。

五、字符串連接函數(shù)strcat:

格式:strcat(字符數(shù)組名1,字符數(shù)組名2);

功能:將字符數(shù)組2的內容連接到字符數(shù)組1 的后面,并在最后加一個“\0”,且將結果存放在字符數(shù)組1中。

?

注意:1、字符數(shù)組必須足夠長,以便容納字符數(shù)組2中的全部內容;

? ? 2、 連接前兩個字符串后面都有一個'\0',連接時將字符數(shù)組1后面的“\0”去掉,只在新字符串后面保留一個“\0”;

? ? 3、使用strcat函數(shù)連接兩個字符串時,應使用#include命令將“string.h”頭文件包含到源文件中;

? ? 4、strcat函數(shù)的返回值是字符數(shù)組1的地址。

.....

char str1[20]={"This is a"};

char str2[]={"string."};

printf("%s",strcat(str1,str2));

....

程序運行結果:

This is a stirng.

也可用下面語句代替:

....

strcat(str1,str2);

printf("%s",str1);

六:測試字符串長度函數(shù)strlen:

格式:strlen(字符數(shù)組);

? ? ? ? ? strlen(字符串);

功能:測試字符數(shù)組中字符串的長度。

1、函數(shù)值不包括'\0'在內的字符數(shù)組中支付差U了的實際長度值;

2、還可以直接對字符串的長度。

strchr

函數(shù)名: strchr

功 能: 在一個串中查找給定字符的第一個匹配之處\

用 法: char *strchr(char *str, char c);

程序例:

#include <string.h>

#include <stdio.h>

int main(void)

{

char string[15];

char *ptr, c = 'r';

strcpy(string, "This is a string");

ptr = strchr(string, c);

if (ptr)

printf("The character %c is at position: %d\n", c, ptr-string);

else

printf("The character was not found\n");

return 0;

}



第九章:結構

一. 定義結構類型與結構變量

在Turbo C中,結構也是一種數(shù)據(jù)類型,可以使用結構變量,因此,象其它類型的變量一樣, 在使用結構變量時要先對其定義。

定義結構變量的一般格式為:

struct 結構名

{

類型 變量名;

類型 變量名;

...

} 結構變量;

結構名是結構的標識符不是變量名。

類型為第二節(jié)中所講述的五種數(shù)據(jù)類型(整型、浮點型、字符型、指針型和無值型)。

構成結構的每一個類型變量稱為結構成員,它象數(shù)組的元素一樣,但數(shù)組中元素是以下標來訪問的,而結構是按變量名字來訪問成員的。

下面舉一個例子來說明怎樣定義結構變量。

struct string

{

char name[8];

int age;

char sex[4];

char depart[20];

float wage1,wage2,wage3;

}person;


這個例子定義了一個結構名為string的結構變量person,如果省略變量名person,則變成對結構的說明。用已說明的結構名也可定義結構變量。這樣定義時上例變成:


struct string

{

char name[8];

int age;

char sex[4];

char depart[20];

float wage1,wage2,wage3;

};

struct string person;

如果需要定義多個具有相同形式的結構變量時用這種方法比較方便,它先作結構說明,再用結構名來定義變量。

例如:

struct string Tianyr, Liuqi, ...;

如果省略結構名,則稱之為無名結構,這種情況常常出現(xiàn)在函數(shù)內部,用這種結構時前面的例子變成:


struct

{

char name[8];

int age;

char sex[4];

char depart[20];

float wage1,wage2,wage3;

} Tianyr, Liuq

結構變量的使用

結構是一個新的數(shù)據(jù)類型,因此結構變量也可以象其它類型的變量一樣賦值、運算,不同的是結構變量以成員作為基本變量。

結構成員的表示方式為:

結構變量.成員名

如果將結構變量.成員名看成一個整體,則這個整體的數(shù)據(jù)類型與結構中該成員的數(shù)據(jù)類型相同,這樣就可象前面所講的變量那樣使用。

下面這個例子定義了一個結構變量,其中每個成員都從鍵盤接收數(shù)據(jù),然后對結構中的浮點數(shù)求和,并顯示運算結果。請注意這個例子中不同結構成員的訪問。


#include

main()

{

struct

{ /*定義一個結構變量*/

char name[8];

int age;

char sex[4];

char depart[20];

float wage1,wage2,wage3;

}a;

float wage;

char c='Y';

while(c=='Y'||c=='y') /*判斷是否繼續(xù)循環(huán)*/

{

printf(\nName:);

scanf(%s, a.name); /*輸入姓名,這里的名字是字符數(shù)組類型不用加@*/

printf(Age:);

scanf(%d, &a.wage); /*輸入年齡這里的年齡是整型要用@*/

printf(Sex:);

scanf(%s, a.sex);

printf(Dept:);

scanf(%s, a.depart);

printf(Wage1:);

scanf(%f, &a.wage1); /*輸入工資*/

printf(Wage2:);

scanf(%f, &a.wage2);

printf(Wage3:);

scanf(%f, &a.wage3);

wage=a.wage1+a.wage2+a.wage3;

printf(The sum of wage is %6.2f\n, wage);

printf(Continue?);

c=getche();

}

}

結構數(shù)組:

結構數(shù)組的聲明

首先假如我們定義的book結構體如下:

struct book {

char title[40];

char author[40];

float value;

};

聲明一個結構數(shù)組與聲明一個其他類型的數(shù)組的方法是一樣的。

struct book library[MAXBKS];//MAXBKS是一個int型的整數(shù)

這條語句聲明library為一個具有MAXBKS個元素的數(shù)組,數(shù)組的每個元素都是bbook類型的結構。因此,library[0]是一個book結構,library[1]是一個book結構,以此類推。

嵌套結構:

一個結構中含有另一個結構,稱為嵌套結構。

嵌套結構在很多時候是非常有用的,比如要建立一個關于朋友的檔案信息的結構,這些信息中肯定要包含名字(name)這個信息,而一個人的名字又包含了姓和名,這時我們就可以把名字(name)本身表示成一個結構,在建立朋友檔案結構的時候直接將其包含進去。

首先建立一個name結構:

struct name{? ? ? ? ? ? //name結構聲明

char firstname[20];

char lastname[20];

};

有了name結構,可以在此基礎上建立guy結構了:


struct guy{

struct name handle;? //結構嵌套,注意這里不用再定義handle的類型,直接這樣表示即可。

char favfood[20];

char job[20];

float income;

};

嵌套結構如何初始化?

初始化方法與普通的結構體初始化方法相同:

struct guy fellow = { //初始化變量

{"xu","song"},

"hambergers",

"student",

23.00

};

嵌套結構中的成員操作:


fellow.handle.firstname //運行結果:xu

fellow.handel.lastname //運行結果:song

fellow.favfood //運行結果:hambergers

fellow.job //運行結果:student

fellow.income //運行結果:23.00

typedef struct與struct 的關系:

typedef是類型定義的意思。typedef struct 是為了使用這個結構體方便。

具體區(qū)別在于:

若struct node {}這樣來定義結構體的話。在申請node 的變量時,需要這樣寫,struct node n;

若用typedef,可以這樣寫,typedef struct node{}NODE; 。在申請變量時就可以這樣寫,NODE n;

區(qū)別就在于使用時,是否可以省去struct這個關鍵字。

在C中定義一個結構體類型要用typedef:

typedef struct Student

{

int a;

}Stu;

于是在聲明變量的時候就可:Stu stu1;

如果沒有typedef就必須用struct Student stu1;來聲明

這里的Stu實際上就是struct Student的別名。

另外這里也可以不寫Student(于是也不能struct Student stu1;了)

typedef struct

{

int a;

}Stu;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容