C語言基礎-字串(string)._第1頁
C語言基礎-字串(string)._第2頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C 語言基礎-字串(string)學長真是苦命校慶補假還要來學校編講義An yway字串的定義在陣列時應該已經講過了,而這堂要講的是字串的處 理(簡單來說是一些字串處理函式)一. 輸入一般輸入字串使用的函式為gets其語法為gets(字串名稱);gets()會讀取換行字元之前的所有字元,並且在最後加上空字元0,再將結果傳給 程式。比較:之前所說的scanf( %s;字串名稱)會讀取換行字元 或空白字元(space.tab) 之前的資料。gets()則單純是換行字元。二. 輸出相對於gets(),一般在輸出字串時所使用的函式為puts其語法如下puts(字串名稱);要注意的是puts會自動在輸出

2、完成之後在最後自動加上換行字元(n) 另外也可以使用printf( %s,字串名稱);來印出字串三其他處理其他常用字串處理函式如下表,注意皆需引入string.h這個標頭檔函式用法用途strle n(stri ng1)計算stringl的長度(不含0)strcat(stri ng1,stri ng2)將string2的內容接到stringl後面strcmp(stri ng1,stri ng2)將stringl和string2做比較,相同傳回0strcpy(stri ng1,stri ng2)將string2的內容複製到stringl內strstr(stri ng1,stri ng2)傳回str

3、ing2在stringl中第一次出現的 位置strrev(stri ngl)將stringl字串倒置C 語言基礎-指標(pointer)接下來是指標了 :(趴) 在正式講解指標之前,要先給大家所謂”記憶體位置”的觀念之前講解變數時有提到,變數的資料都是儲存在記憶體中的,每一格記憶體(byte當單位)都有自己的一個”編號”,這個編號就是所謂的記憶體位置。那麼,當我們提到”變數的記憶體位置時”,應該就有人要舉手了整數不是動不動就4byte嗎?.”沒錯,所以變數的記憶體位置是以第一個byte的位置當作此變數的位置大多數情況下,記憶體位置都採用16進位法來表示,如0 x100等聽不懂嗎?請看飯粒(5點

4、半肚子餓了)#i nclude#i ncludeint mai n()int a=4;prin tf(%dn,a);prin tf(%x,&a); system(pause);在這個程式中出現的&,和使用scanf()時的&一樣,不是位元運算的and,而是所謂 的”取址符號”名副其實,取址符號就是用來取指的,也就是他會取得變數的記憶 體位置。/他是運算子今天應該是上到這吧/我錯了 指標的宣告指標的宣告語法如下 型態(tài)名稱*指標名稱舉例來說我宣告一個整數型態(tài)的指標指標有的型態(tài)跟變數的型態(tài)一樣,而要注意是指標的型態(tài)必須與所指向的空 間型態(tài)一樣。至於給定指標的值的方式有兩種in

5、t a;int *pa=&a;int a;int *pa;pa=&a;那麼,由於指標內存的是一個變數的值,那麼當我們沿著這個指標所存的位 置回溯,就能得到變數的值了。要在程式中取得該指標位置所指向的變數的值,寫成下面的方式就可以了*pa見下方的程式範例#i nclude #i nclude int mai n()int a=4;int *pa;prin tf(%dn,a); printf( %xn”,&a); prin tf(%xn,pa);prin tf(%dn,*pa); system(pause);當然,指標所指向的變數是可以改變的。要注意的一點就是如果沒有給定指

6、向的變數的話,有可能會發(fā)生難以預料的 錯誤唷。指標與函式指標也可以當作函式的參數 直接在宣告函式時在宣告參數的地方宣告指標好了int f(int *p);這就是所謂的傳址呼叫而之前所用的則稱為傳值呼叫程式範例#in clude#in cludein t f(in t*,i nt*);int mai n()int a=5;int b=3;int* pa,*pb;prin tf(%dt%dn,a,b);pa=&a;pb=&b;f(pa,pb);prin tf(%dt%dn,a,b); system(pause);int f(i nt *pa,i nt *pb)int swit;sw

7、it=*pa;*pa=*pb;*pb=swit;上課專心聽講另外陣列也是用指標的觀念 指標的運算也請大家用力記住吧 再這裡要開始補充一些之前上函式時忘記講到的東西了inline函式一般正常的函式再被呼叫時會經過一番麻煩的手續(xù)之後才做程式敘述,這冗長的手續(xù)包括複製引述機器暫存器儲存起來而inline提供了一個解決的方法:他直接將函數內的程式敘述加入至呼叫函式的地方,因此節(jié)省了許多動作inline函式定義極為簡單,將關鍵字加值宣告之前就行了 範例#i nclude#i nclude in li ne int f(i nt a,i nt b)a=a+b; int mai n()int i=10;in

8、t j=5;f(i,j);printf( %d”);system( pause”;函式的重載(多載)這裡要教的是overloaded的觀念,指的是同一函式名稱重複使用於不同的型 態(tài)和定義 C是一種型態(tài)相當嚴格的語言,所以只要參數不相同就會被視為不同的 函式 範例#i nclude#in cludeint max(i nt,i nt);int max(i nt,i nt,i nt);int mai n()int a=5,b=10,c=15;printf( %c”max(a,b); printf( %c”max(a,b,c);system( pause”;return 0;int max(i nt

9、 h,i nt i)return (hi)?h:l;int max(i nt h,i nt I,i nt j)return (max(h,i)j)?max(h,i):j; 三元運算子一.開檔檔案的輸出入基本上跟標準輸出入相去無幾,僅是來源不同而已,而在開始輸出入 之前,必須先有開檔的動作使用fopen()(在stdio.h裡)FILE *fope n(const char *path,c onst char *mode);FILE是定義在stdio中包含檔案相關資訊的結構在開檔前應先宣告一個FILE型態(tài)的指標以接受fopen()的回傳值除此之外,在stdio.h中還定義了三個檔案指標檔案指標名

10、稱說明stdi n標準輸入連結系統(tǒng)的輸入系統(tǒng)(般為鍵盤)stdout標準輸出連結系統(tǒng)的輸出系統(tǒng)(一般為螢幕)stderr標準錯誤輸出連結系統(tǒng)的輸出系統(tǒng)(一般為螢幕)path有兩種方法,即為相對路徑根絕對路徑注意打絕對路徑時因為跳脫字元的關係所以必須打兩個反斜線Ex:”C:test.txt”另外,不同作業(yè)系統(tǒng)藥用不同符號,例如UNIX下要用/Mode是用來辨別檔案的開啟模式模式意義r開啟用來讀取的檔案,檔案不存在傳回NULLw開啟用來舄入的檔案,自行建立新檔,檔案存在則覆盍舊檔a開啟用來寫入的檔案,寫入的資料放在檔案末,不存在則建立新檔r+開啟可讀可舄的檔案,檔案不存在傳回NULLw+開啟可讀可

11、舄的檔案,檔案不存在則建立新檔,檔案存在則刪除舊檔a+開啟可讀可舄的檔案,檔案不存在則建立新檔,檔案存在則加在檔尾在以上的mode加上b代表二進位模式,如rb,rb+所謂的二進位模式是用來開啟 二進位檔的,而與二進位檔相對的是文字檔兩種檔案的差別在於說文字懂將其中的資料都儲存為字元,而在二進位檔中,則以二進位的方式表示F面並提供一些其他常用的函式函式用途fsca nf(FILE *stream,co nst char *format;J;類似scanf()fprin tf(FILE *stream,c onst char *format,);類似printf()fgets(char *str,

12、int size,FILE *stream);似gets()但會讀入換行字元fputs(c onst char *str,FILE*stream);似puts(),但不會加換行字兀fclose(FILE *stream);記得關檔是也/講師旁的電腦keroro放映中#i nclude#i ncludeint mai n()int a,b;char tmp50;FILE *fa,*fb;fa=fopen( in.txt”);fb=fopen( C:out.txt ”w+”);fprintf(stdout,輸入欲讀的字串數”); fscan f(stdi n:%c”&a);for(b=0;

13、ba;b+) fgets(tmp,50,fa); fputs(tmp,fb);fclose(fa);fclose(fb);return 0;動態(tài)配置記憶體之前變數的宣告,都是使用靜態(tài)宣告的方式,也就是在編譯階段即完成 宣告;現在我們要介紹的是動態(tài)宣告,能夠在程式執(zhí)行中才配置記憶體空間, 使記憶體的使用更加具有彈性。以下是兩種配置方式的比較:動態(tài)配置靜態(tài)配置記憶體配置執(zhí)行階段編譯階段記憶體釋放程式結束釋放,否則造成記憶缺 口程式結束自動歸還系統(tǒng)效能較慢較快指標遺失位 址記憶缺口無此問題配置動態(tài)空間所使用的函數常用的是malloc()和free(),前者是配置所需的空間,後者是釋放配置的空間。兩個

14、函數都宣告在stdlib.h裡,需要引入才可使用?!菊Z法】資料型態(tài)*指標名稱=(資料型態(tài)*)malloc(sizeof(資料型態(tài))*資料長度);free(指標名稱);【範例】#i nclude #i nclude int main()int i,n, *num, sum=0;printf(輸入多少數字:);sca nf(%d,&n);num=(i nt*)malloc(sizeof(i nt)* n);for(i=0;i n;i+)printf(輸入第%d個數字:,i+1);scan f(%d,&n umi);sum+=nu mi;printf(總和為:%dn,sum); sy

15、stem(pause);return 0; /這份講義絕對沒有抄去年的講義前置處理器(preprocessor)所謂的前(置)處理器是編譯器裡的一部分。這是compiler在編譯之前編譯器所 執(zhí)行的程序,而他的功能是藉由指令 倂開頭的)好讓原始碼進入準備編譯的狀況,而 這些指令稱為前處理指令(preprocessor directive)。以下為較常見的前處理指令功能#i nclude引入標頭檔(v原有,”自訂”)#if啟動條件編譯#en dif編譯至此#else基本上#elif不用說明了吧#defi ne定義巨集#un def取消定義#if defined( #ifdef)檢查某字是否被疋義

16、#if !defi ned (#ifndef)檢查某字是否未被定義#error編譯器錯誤訊息Include引入標頭檔,而標頭檔基本的作用就是定義函式。原有的引入檔需用才舌起來,而自訂的標頭檔則由”包起,注意必須放在跟程式同 一資料夾下。#in clude ” eggegg.hIf可以判斷一個運算式是否為真或一個符號是否已被定義。若為真則會編譯並執(zhí)行該#if至#else.#elif或#endif。#if robber=”強者”return 0;#en difDefine的公用是所為的定義巨集。巨集的基本觀念跟inline函式一樣就是對關鍵字進行取代,而他除了函式之外野可以定義常數。#define

17、 robber弱者”#define robber() printf( robber彳艮弱n ”)Error基本上配合#if作用,用於當作結束編譯並輸出編譯器訊息。#if ndef robber#error robber is weak”typedeftypedef可以幫資料型態(tài)取另外一個名字。typedef資料型態(tài) 識別字;例如說typedef un sig ned long long Count;之後Count a;就代表a為unsigned long longenum基本上,en um (列舉)具備了自己定義資料型態(tài)的意義 宣告enum列舉型態(tài)識別字1,識別字2廠例如enum weekSU

18、N,MON,TUE,WED,THU,FRI,SAT;則稍後就可以week w=SUN;順帶一提,其實後面的自訂值都是以整數儲存【範例】#i nclude#i ncludeenum MonthJa n,Feb,Mar,Apr,May,Ju n,J ul,Aug,Sep,Oct,Nov,Dec;int mDays12=31,28,31,30,31,30,31,31,30,31,30,31;int main()int m,d,days;printf(請輸入今天的日期(mm/dd):);sca nf(%d/%d,&m,&d);days=mDaysm-1-d;switch(m)case

19、Jan: days+=mDaysJa n;case Feb: days+=mDaysFeb;case Mar: days+=mDaysMar;case Apr: days+=mDaysApr;case May: days+=mDaysMay;case Jun: days+=mDaysJ un;case Jul: days+=mDaysJul;case Aug: days+=mDaysAug;case Sep: days+=mDaysSep;case Oct: days+=mDaysOct;case Nov: days+=mDaysNov;case Dec: days+=mDaysDec;pri

20、ntf(”今天距離到年底還有%d天n,days);system(PAUSE);return 0;struct這是所謂的結構資料型態(tài),也是使用者自訂的型態(tài)。與列舉不同,結構用的是一種 接近包裝的觀念。語法如下struct結構資料型態(tài)資料型態(tài)識別字;資料型態(tài)識別字;例如:struct Stude ntlong id;int age;char n ame10; classmate;/宣告資料型態(tài)為struct Student的classmate變數如果要初始化結構變數的值,方式跟陣列如初一轍。例如:struct Stude nt classmate=3300168,16,張三;結構的存取定義結構及宣告結構變數後,就可以開始使用結構了。只要在結構變數後加 上小數點()再加上成員名稱,就可以取得該筆資料,始用起來跟一般變數一 樣。承接上面的例子:printf(%d,classmate.id);印出3300168scanf(%d,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論