Presentation is loading. Please wait.

Presentation is loading. Please wait.

複習 int count=8; int* pt=&count; //等於 pt=&count, //不等於*pt=&count

Similar presentations


Presentation on theme: "複習 int count=8; int* pt=&count; //等於 pt=&count, //不等於*pt=&count"— Presentation transcript:

1 複習 int count=8; int* pt=&count; //等於 pt=&count, //不等於*pt=&count
printf(“%d”,count); //得到9

2 複習 int i; int count[5]={1,2,3,4,5}; int* pt=count; //等於 pt=count,
for(i=0;i<5;i++){ (*(pt+i))+=1; printf(“%d ”,count[i]); } //得到2,3,4,5,6

3 Class 6 字元與字串

4 字元 一個英文字母、數字或其他的符號 在記憶體中佔一個位元組 是一串文字(字串)的最小基本單位
‘$’、‘!’、‘G’、‘l’ 都是一個字元 在記憶體中佔一個位元組 是一串文字(字串)的最小基本單位 要表示一個字元,用一對單引號’‘把該字元夾起來 char c='a';

5 字元與整數對應 每一個字元在記憶體中,其實可以當作是一個佔用1 byte的整數值 每一個整數值根據相對應的字元表,有其代表的字元
如果是3個字元 如果是一個整數 ‘1’ ‘2’ ‘3’ 123 49 50 51 1byte 4bytes

6 ASCII碼 符號與數字的對應關係 其實字元也是一個數字,因此也可以拿來做加減乘除等四則運算 數字 符號 48 65 A 97 a 49 1
65 A 97 a 49 1 66 B 98 b 50 2 67 C 99 c 51 3 68 D 100 d 52 4 69 E 101 e

7 字元變數的宣告與設定 char i_am_a_char; char i_am_another='K'; //字元常數用兩個單引號括起來

8 印出字元 在printf()或scanf()中,字元使用的代表格式是%c 課堂練習
printf("Print a char: %c %c %c", i_am_another, 'B', 49); 課堂練習 用一個for迴圈印出48~122的整數值對應的字元

9 字元的運算 一個字元型態佔用1個位元組,數值介於0到255之間 下面程式會印出d 下面程式會印出A到Z及它們的ASCII碼值
因此無論是加、減運算或關係比較運算,都可以想作是整數運算 下面程式會印出d char c='a'; c=c+3; printf("%c", c); 下面程式會印出A到Z及它們的ASCII碼值 char c; for(c='A'; c<='Z'; c++) printf("%c %d\n", c, c);

10 字元的輸出與輸入 printf()&scanf() getchar()&putchar()
scanf(“%c”,&ch); //scanf()後面的參數是位址 printf("This charactre is %c.\n",ch); getchar()&putchar() ch=getchar(); //一次讀一個字元 putchar(ch); //一次印一個字元 putchar('\n'); //印一個字元「換行」

11 注意 scanf()與getchar()在以鍵盤輸入的情況下,都需要使用者按下Enter鍵之後,才會開始進行讀取的動作
所以以scanf()函式讀取資料、或是以getchar()讀取字元時,都會遺留下換行字元'\n‘ 為了不影響下一次讀入字元的動作,記得要處理遺留下來的部分 善用fflush(stdin)

12 getch() 不需等待Enter鍵,使用者按下什麼,就讀入什麼的函式
欲使用getch()需#include <conio.h> ch = getch(); //getch()不會echo字元到螢幕上 while(getch()!='k'); //這個迴圈在沒輸入k之前不會離開

13 字元處理函式 #include <ctype.h> int isdigit(int c) 檢查c是不是一個數字字元
int isalpha(int c) 檢查c是不是一個英文字母 int isalnum(int c) 檢查c是不是一個數字或字母 int islower(int c) 檢查c是不是小寫字母 int isupper(int c) 檢查c是不是大寫字母 int tolower(int c) 如果c是大寫字母,則傳回小寫,否則傳原值 int toupper(int c) 如果c是小寫字母,則傳回大寫,否則傳原值

14 課堂練習 用一個for迴圈印出1~256的整數值對應的字元,以及其對應的4個值:isalpha()、isdigit()、islower()、isupper()

15 字串 在程式語言中,一個英文單字、一個句子,都可以當成一個字串 紀錄size超過一個字母的東西
在C語言中,一個一維的字元陣列可以當成一個字串 char student_name[30]; //表示學生名字最多30個字元

16 結尾字元 字串最後一定要有一個NULL(‘\0’、數值為0)字元
許多與字串處理相關的函式(如printf())都必須靠這個字元判斷字串的結尾在哪裡

17 字串初始值設定 char my_name[8] = "haKao"; //後三個字元都是NULL
字元(字串)指標 char *name_ptr = my_name;

18 字串的輸入與輸出 在 scanf及printf讀入及印出一個字串是使用%s
char s[20]; scanf("%s", s); printf("%s", s); 由於s本身就是這個字元陣列的位址,所以在 scanf裡我們不需要加上&符號 在使用scanf()讀取字串時,遇到空白字元便會結束 假如輸入“Hello! Ann!",則讀進來的字串只有"Hello!"而已

19 gets、puts gets:讀入字串 puts :印出字串
gets(my_name); //讀到換行字元為止,並把'\n'取代成為NULL puts(my_name); //把my_name印出來,最後加上'\n' 上面要注意的是,如果是使用gets,會連換行一起讀進來,也就是字串後面會多一個'\n'字元

20 課堂練習 宣告一個20字元大小的字串後,讀入一個字串(使用gets()),將所有字元轉成大寫印出來(使用toupper())

21 字串相關函式 要做字串的比對、字串串接、字串長度等功能,沒有運算子可以使用,故必須使用函式來處理
和字串相關的函式都是定義在string.h中 strcpy(s1,s2) 將s2的內容複製到s1,並傳回s1 strcmp(s1,s2) 比較s1、s2的內容,如果相等傳回0,前者大傳回正值,否則負值 strcat(s1,s2) 將s2串接到s1後面,並傳回s1 strstr(s1,s2) 傳回s2字串在s1字串中第一次出現的位置 strlen(s1) 傳回s1的長度(不含'\0'字元) strrev(s1) 將s1字串倒置

22 範例練習 在第二次世界大戰中,德軍的通訊編碼被美國破解,以致於機密被美國竊聽而慘敗
德軍的編碼規則(假)如下:將訊息每個字母往後推兩位再傳出去,例如 A→C、B→D,而後面的 Y→A、Z→B,所有的訊息都是大寫字母 而收到訊息的則是將每個字母往前推兩位,例如 C→A、D→B,而前面的 A→Y、B→Z 假設你是美軍的情報軍,要快速編碼及解碼德軍的訊息,希望完成一個程式,第一個字元為+代表要編碼,第一個字元為-代表要解碼 如:輸入+FIRE後會輸出HKTG;輸入-UVQR後會輸出STOP

23

24 課堂練習 修改範例練習 編碼:往前推三位 解碼:往後推三位 Bonus A->X, D->A X->A, A->D
大小寫

25 字串陣列 字串陣列可以看作是一個二維的陣列: char names[4][11]; //可以放4個10個字的字串
printf("%c\n", names[0][0]); //印第一個字串的第一個字元 printf("%s\n", names[1]); //印第二個字串的內容 printf("%s\n", &names[1][1]); //第2個字串的第2個字元當作字串印出

26 字串陣列初始化 char names[4][11]={"Michael","John","Maggie","McGyver"};
\0 J o n g G y v r

27 作業七 參考hw7.doc


Download ppt "複習 int count=8; int* pt=&count; //等於 pt=&count, //不等於*pt=&count"

Similar presentations


Ads by Google