版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C語言基礎-字串(string)學長真是苦命校慶補假還要來學校編講義An yway字串的定義在陣列時應該已經講過了 ,而這堂要講的是字串的處 理(簡單來說是一些字串處理函式) 一.輸入一般輸入字串使用的函式為gets其語法為gets(字串名稱);gets()會讀取換行字元之前的所有字元,並且在最後加上空字元0 ',再將結果傳給 程式。比較:之前所說的scanf( %S;字串名稱)會讀取換行字元 或空白字元(space.tab) 之前的資料。gets()則單純是換行字元。二.輸出相對於gets(),般在輸出字串時所使用的函式為puts其語法如下P uts(字串名稱);要注意的是puts會
2、自動在輸出完成之後在最後自動加上換行字元(n) 另外也可以使用printf( %s;字串名稱);來印出字串三其他處理其他常用字串處理函式如下表,注意皆需引入string.h這個標頭檔函式用法用途strle n(stri ng1)計算string1的長度(不含0)strcat(stri ng1,stn ng2)將string2的內容接到string1後面strc mp( stri ng1,stn ng2)將string1和string2做比較,相同傳回0strc py (stri ng1,stn ng2)將string2的內容複製到string1內strstr(stri ng1,stn ng2)
3、傳回string2在string1中第一次出現的 位置strrev(stri ng1)將string1字串倒置C語言基礎-指標(pointer)接下來是指標了 :(趴) 在正式講解指標之前,要先給大家所謂”記憶體位置”的觀念之前講解變數時有提到,變數的資料都是儲存在記憶體中的,每一格記憶體(byte 當單位)都有自己的一個”編號”,這個編號就是所謂的記憶體位置。那麼,當我們提到”變數的記憶體位置時”,應該就有人要舉手了整數不是動不動就4byte嗎?:”沒錯,所以變數的記憶體位置是以第一個byte的位置當作此變數的位置大多數情況下,記憶體位置都採用16進位法來表示,如0x100等聽不懂嗎?請看飯
4、粒(5點半肚子餓了)#i ncludevstdio.h>#i ncludevstdlib.h> int mai n()int a=4;prin tf("%dn",a); prin tf("%x",&a); system(" pause");在這個程式中出現的&和使用seanfO時的&一樣,不是位元運算的and,而是所謂 的”取址符號”名副其實,取址符號就是用來取指的,也就是他會取得變數的記憶 體位置。/他是運算子今天應該是上到這吧:/我錯了指標的宣告指標的宣告語法如下 型態名稱*指標名稱舉例來說我宣
5、告一個整數型態的指標int *a;指標有的型態跟變數的型態一樣,而要注意是指標的型態必須與所指向的空 間型態一樣。至於給定指標的值的方式有兩種int a;int *pa=&a;int a;int *pa;pa=&a;那麼,由於指標內存的是一個變數的值,那麼當我們沿著這個指標所存的位 置回溯,就能得到變數的值了。要在程式中取得該指標位置所指向的變數的值,寫成下面的方式就可以了。pa見下方的程式範例#i ncludevstdio.h> #i ncludevstdlib.h> int mai n()int a=4;int *pa;prin tf("%dn&quo
6、t;,a); printf( %xn”,&a); prin tf("%xn", pa);prin tf("%dn",* pa); system(" pause");當然,指標所指向的變數是可以改變的。要注意的一點就是如果沒有給定指向的變數的話,有可能會發生難以預料的 錯誤唷。指標與函式指標也可以當作函式的參數 直接在宣告函式時在宣告參數的地方宣告指標好了int f(int *p);這就是所謂的傳址呼叫而之前所用的則稱為傳值呼叫程式範例#in cludevstdio.h>#in clude<stdlib.h>i
7、nt f(in t*,i nt*);int mai n()int a=5;int b=3; int* p a,* pb;prin tf("%dt%dn"ab);pa=&a;pb=&b;f(pa,pb);prin tf("%dt%dn",a,b); system(" pause");int f(int *p a,i nt *p b)int swit; swit=* pa; *p a=* pb;*p b=swit;上課專心聽講另外陣列也是用指標的觀念 指標的運算也請大家用力記住吧再這裡要開始補充一些之前上函式時忘記講到的東
8、西了 inline函式一般正常的函式再被呼叫時會經過一番麻煩的手續之後才做程式敘述,這冗長的手續包括複製引述.機器暫存器儲存起來而inline提供了一個解決的方法: 他直接將函數內的程式敘述加入至呼叫函式的地方,因此節省了許多動作inline函式定義極為簡單,將關鍵字加值宣告之前就行了 範例#i ncludevstdio.h>#i ncludevstdlib.h> in li ne int f(i nt a,i nt b)a=a+b; int mai n()int i=10;int j=5;f(i,j);printf( %d”);system( pause”; 函式的重載(多載)這
9、裡要教的是overloaded的觀念,指的是同一函式名稱重複使用於不同的型 態和定義.C是一種型態相當嚴格的語言,所以只要參數不相同就會被視為不同的 函式 範例|#in clude<stdio.h>tin clude<stdlib.h>nt max(i nt,i nt);nt max(i nt, in t,i nt);nt mai n()int a=5,b=10,c=15;pnntf( %cr,max(a,b);pnntf( %cr,max(a,b,c);system( pause”;return 0;int max(i nt h,i nt i)retur n (h&g
10、t;i)?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 *fopen(const char *p ath,c onst char *mode);FILE是定義在stdio中包含檔案相關資訊的結構在開檔前應先宣告一個FILE型態的指標以接受fopen()的回傳值除此之外,在stdio.h中還定義了三個檔案指標檔案指標名稱說明stdi n
11、標準輸入連結系統的輸入系統(一般為鍵盤)stdout標準輸出連結系統的輸出系統(一般為螢幕)stderr標準錯誤輸出連結系統的輸出系統(一般為螢幕)path有兩種方法,即為相對路徑根絕對路徑注意打絕對路徑時因為跳脫字元的關係所以必須打兩個反斜線Ex:”C:test.txt ”另外,不同作業系統藥用不同符號,例如UNIX下要用/Mode是用來辨別檔案的開啟模式模式意義r開啟用來讀取的檔案,檔案不存在傳回NULLw開啟用來寫入的檔案,自行建立新檔,檔案存在則覆蓋舊檔a開啟用來寫入的檔案,寫入的資料放在檔案末,不存在則建立新檔r+開啟可讀可寫的檔案,檔案不存在傳回NULLw+開啟可讀可寫的檔案,檔案
12、不存在則建立新檔,檔案存在則刪除舊檔a+開啟可讀可寫的檔案,檔案不存在則建立新檔,檔案存在則加在檔尾在以上的mode加上b代表二進位模式,如rb,rb+ 所謂的二進位模式是用來開啟 二進位檔的,而與二進位檔相對的是文字檔兩種檔案的差別在於說文字懂將其中的資料都儲存為字元,而在二進位檔中,則以二進位的方式表示F面並提供一些其他常用的函式函式用途fsca nf(FILE *stream,co nst char *format;);類似 scanf()fprin tf(FILE *stream,c onst char *format,);類似 printfOfgets(char *str,i nt
13、size,FILE *stream);似gets()但會讀入換行字元fpu ts(c onst char *str,FILE*stream);似puts(),但不會加換行字元fclose(FILE *stream);記得關檔是也II講師旁的電腦keroro放映中#i ncludevstdio.h>#i ncludevstdlib.h>int mai n()int a,b;char tmp 50;FILE *fa,*fb;fa=fopen( in.txt”); fb=fopen( C:out.txt ”w+”); fprintf(stdout,輸入欲讀的字串數”); fscan f(
14、stdi n :&a);for(b=0;b<a;b+)fgets(t mp ,50,fa); fputs(tm p, fb);fclose(fa); fclose(fb);return 0;動態配置記憶體之前變數的宣告,都是使用靜態宣告的方式,也就是在編譯階段即完成 宣告;現在我們要介紹的是動態宣告,能夠在程式執行中才配置記憶體空間, 使記憶體的使用更加具有彈性。以下是兩種配置方式的比較:動態配置靜態配置記憶體配置執行階段編譯階段記憶體釋放程式結束釋放,否則造成記憶缺 口程式結束自動歸還系統效能較慢較快指標遺失位 址記憶缺口無此問題配置動態空間所使用的函數常用的是malloc()
15、和free(),前者是配置所需的空間,後者是釋放配置的空間。兩個函數都宣告在 stdlib.h裡,需要引入才可使用。【語法】資料型態)*資料長資料型態*指標名稱=(資料型態*)malloc(sizeof( 度);free(指標名稱);【範例】#i nclude vstdio.h>#i nclude <stdlib.h>int main()int i,n, *num, sum=O;printf(" 輸入多少數字:");sca nf("%d",&n);num=(i nt*)malloc(sizeof(i nt)* n);for(i=
16、0;i< n;i+)printf(" 輸入第%d個數字:",i+1); scan f("%d",&n umi);sum+=nu mi;printf(”總和為:%dn",sum);system(" pause");return 0;/這份講義絕對沒有抄去年的講義前置處理器(preprocessor)所謂的前(置)處理器是編譯器裡的一部分。這是 com pi ler在編譯之前編譯器所 執行的程序,而他的功能是藉由指令 倂開頭的)好讓原始碼進入準備編譯的狀況,而 這些指令稱為前處理指令(preprocessor di
17、rective)。以下為較常見的前處理指令功能#i nclude引入標頭檔(原有,”自訂”#if啟動條件編譯#en dif編譯至此#else基本上#elif不用說明了吧#defi ne定義巨集#un def取消疋義#if defined( #ifdef)檢查某字是否被定義#if !defi ned (#ifndef)檢查某字是否未被定義#error編譯器錯誤訊息Include引入標頭檔,而標頭檔基本的作用就是定義函式。原有的引入檔需用 才舌起來,而自訂的標頭檔則由”包起,注意必須放在跟程式同 一資料夾下。#in clude ” eggegg.h”If可以判斷一個運算式是否為真或一個符號是否已被
18、定義。若為真則會編譯並執 行該 #if 至# else.#elif 或#6门dif。#if robber=”強者”return 0;#en difDefine的公用是所為的定義巨集。巨集的基本觀念跟inline函式一樣就是對關鍵字進行取代,而他除了函式之外野可以定義常數。#define robber 弱者”#define robber() printf( robber 彳艮弱 n ”)Error基本上配合#if作用,用於當作結束編譯並輸出編譯器訊息。#if ndef robber#error robber is weak”typ edeftypedef可以幫資料型態取另外一個名字。 typed
19、ef資料型態 識別字;例如說typ edef un sig ned long long Count;之後Count a;就代表 a 為 unsigned long long enum基本上,en um (列舉)具備了自己定義資料型態的意義 宣告enum列舉型態識別字1,識別字2,例如enum weekSUN,MON,TUE,WED,THU,FRI,SAT;則稍後就可以week w=SUN;順帶一提,其實後面的自訂值都是以整數儲存【範例】#i ncludevstdio.h>#i ncludevstdlib.h>enum MonthJa n,Feb,Mar,A pr,May,Ju n,
20、Jul,Aug,Se p,O ct,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 Jan: days+=mDaysJa n;case Feb: days+=mDaysFeb;case Mar: days+=mDaysMar;case Apr: days+=mDaysA
21、pr;case May: days+=mDaysMay;case Jun: days+=mDaysJu n;case Jul: days+=mDaysJul;case Aug: days+=mDaysAug;case Sep: days+=mDaysSe p;case Oct: days+=mDaysOct;case Nov: days+=mDaysNov;case Dec: days+=mDaysDec;printf("今天距離到年底還有%d天n",days);system(" PAUSE");return 0; struct這是所謂的結構資料型態,也
22、是使用者自訂的型態。與列舉不同,結構用的是一種 接近包裝的觀念。語法如下struct結構資料型態資料型態識別字;資料型態識別字;例如:struct Stude ntlong id;int age;char n ame10;的classmate 變數如果要初始化結構變數的值,方式跟陣列如初一轍。例如:struct Stude nt classmate=3300168,16,"張三" classmate;/宣告資料型態為 struct Student結構的存取定義結構及宣告結構變數後,就可以開始使用結構了。只要在結構變數後加 上小數點(.)再加上成員名稱,就可以取得該筆資料,始
23、用起來跟一般變數一 樣。承接上面的例子:印出 3300168輸入數字存入age裡prin tf("%d",classmate.id);/ sca nf("%d",&classmate.age);/【範例】#i nclude vstdio.h>#i nclude <stdlib.h>struct Itemchar n ame20;int p rice;int main()int i;struct Item stuff3; for(i=0;i<3;i+) printf("輸入物品%d的名稱:",i+1);scan f("%s",stuffi. name); printf("輸入物品%d的價錢:",i+1);scan f("%d",&stuffi. price);物品清單-n");printf("n for(i=0;i<3;i+) printf(" 物品 %d:%st 價錢:%dn",i+1,stuffi. name,stuffi. price);system(" pause");return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024货物进口合同(范本)
- 2024年广西路分公司一级干线运输合同
- 2024年度数据处理与分析合作协议
- 2024个人房产抵押合同
- 2024年基因治疗技术开发合同
- 2024年度智能医疗系统开发合同
- 2024年度建筑施工安全环保技术创新与应用合同
- 2024年废料交易合同标准版
- 2024年建筑基坑钻探检测合同
- 2024年度F公司太阳能发电设备安装合同
- 全国高职高专英语写作大赛
- 微机原理与接口技术8259A练习题及答案
- 正方体的11种展开图
- 第15章《分式》教材分析课件(32张)
- 商铺装修工程施工方案.
- 西门子RWD68说明书
- 形式发票样本(Proforma Invoice)
- 医院车辆加油卡管理制度
- 数独题目高级50题(后附答案)【最新】
- 问题线索办理呈批表
- 学、练、评一体化课堂模式下赛的两个问题与对策
评论
0/150
提交评论