270 likes | 394 Views
複習. int count=8; int* pt=&count; // 等於 pt=&count, // 不等於 *pt=&count (*count)++; printf(“%d”,count); // 得到 9. 複習. int i; int count[5]={1,2,3,4,5}; int* pt=count; // 等於 pt=count, // 不等於 *pt=count for(i=0;i<5;i++){ (*(pt+i))+=1;
E N D
複習 int count=8; int* pt=&count; //等於 pt=&count, //不等於*pt=&count (*count)++; printf(“%d”,count); //得到9
複習 int i; int count[5]={1,2,3,4,5}; int* pt=count; //等於 pt=count, //不等於*pt=count for(i=0;i<5;i++){ (*(pt+i))+=1; printf(“%d ”,count[i]); } //得到2,3,4,5,6
字元 • 一個英文字母、數字或其他的符號 • ‘$’、‘!’、‘G’、‘l’ 都是一個字元 • 在記憶體中佔一個位元組 • 是一串文字(字串)的最小基本單位 • 要表示一個字元,用一對單引號’‘把該字元夾起來 • char c='a';
字元與整數對應 • 每一個字元在記憶體中,其實可以當作是一個佔用1 byte的整數值 • 每一個整數值根據相對應的字元表,有其代表的字元
ASCII碼 • 符號與數字的對應關係 • 其實字元也是一個數字,因此也可以拿來做加減乘除等四則運算
字元變數的宣告與設定 • char i_am_a_char; • char i_am_another='K'; //字元常數用兩個單引號括起來
印出字元 • 在printf()或scanf()中,字元使用的代表格式是%c • printf("Print a char: %c %c %c", i_am_another, 'B', 49); • 課堂練習 • 用一個for迴圈印出48~122的整數值對應的字元
字元的運算 • 一個字元型態佔用1個位元組,數值介於0到255之間 • 因此無論是加、減運算或關係比較運算,都可以想作是整數運算 • 下面程式會印出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);
字元的輸出與輸入 • printf()&scanf() • scanf(“%c”,&ch); //scanf()後面的參數是位址 • printf("This charactre is %c.\n",ch); • getchar()&putchar() • ch=getchar(); //一次讀一個字元 • putchar(ch); //一次印一個字元 • putchar('\n'); //印一個字元「換行」
注意 • scanf()與getchar()在以鍵盤輸入的情況下,都需要使用者按下Enter鍵之後,才會開始進行讀取的動作 • 所以以scanf()函式讀取資料、或是以getchar()讀取字元時,都會遺留下換行字元'\n‘ • 為了不影響下一次讀入字元的動作,記得要處理遺留下來的部分 • 善用fflush(stdin)
getch() • 不需等待Enter鍵,使用者按下什麼,就讀入什麼的函式 • 欲使用getch()需#include <conio.h> • ch = getch(); //getch()不會echo字元到螢幕上 • while(getch()!='k'); //這個迴圈在沒輸入k之前不會離開
字元處理函式 • #include <ctype.h>
課堂練習 • 用一個for迴圈印出1~256的整數值對應的字元,以及其對應的4個值:isalpha()、isdigit()、islower()、isupper()
字串 • 在程式語言中,一個英文單字、一個句子,都可以當成一個字串 • 紀錄size超過一個字母的東西 • 在C語言中,一個一維的字元陣列可以當成一個字串 • char student_name[30]; //表示學生名字最多30個字元
結尾字元 • 字串最後一定要有一個NULL(‘\0’、數值為0)字元 • 許多與字串處理相關的函式(如printf())都必須靠這個字元判斷字串的結尾在哪裡
字串初始值設定 • char my_name[8] = "haKao"; //後三個字元都是NULL • char my_name[8] = {'h','a','K','a','o'}; //同上 • char my_name[] = "haKao"; //是一個六個字元的陣列, my_name[5]為'\0' • char my_name[8] = {'h','a','K','a','o','\0'}; //同上 • 字元(字串)指標 • char *name_ptr = my_name;
字串的輸入與輸出 • 在 scanf及printf讀入及印出一個字串是使用%s • char s[20]; scanf("%s", s); printf("%s", s); • 由於s本身就是這個字元陣列的位址,所以在 scanf裡我們不需要加上&符號 • 在使用scanf()讀取字串時,遇到空白字元便會結束 • 假如輸入“Hello!Ann!",則讀進來的字串只有"Hello!"而已
gets、puts • gets:讀入字串 • puts :印出字串 • gets(my_name); //讀到換行字元為止,並把'\n'取代成為NULL • puts(my_name); //把my_name印出來,最後加上'\n' • 上面要注意的是,如果是使用gets,會連換行一起讀進來,也就是字串後面會多一個'\n'字元
課堂練習 • 宣告一個20字元大小的字串後,讀入一個字串(使用gets()),將所有字元轉成大寫印出來(使用toupper())
字串相關函式 • 要做字串的比對、字串串接、字串長度等功能,沒有運算子可以使用,故必須使用函式來處理 • 和字串相關的函式都是定義在string.h中
範例練習 • 在第二次世界大戰中,德軍的通訊編碼被美國破解,以致於機密被美國竊聽而慘敗 • 德軍的編碼規則(假)如下:將訊息每個字母往後推兩位再傳出去,例如 A→C、B→D,而後面的 Y→A、Z→B,所有的訊息都是大寫字母 • 而收到訊息的則是將每個字母往前推兩位,例如 C→A、D→B,而前面的 A→Y、B→Z • 假設你是美軍的情報軍,要快速編碼及解碼德軍的訊息,希望完成一個程式,第一個字元為+代表要編碼,第一個字元為-代表要解碼 • 如:輸入+FIRE後會輸出HKTG;輸入-UVQR後會輸出STOP
課堂練習 • 修改範例練習 • 編碼:往前推三位 • A->X, D->A • 解碼:往後推三位 • X->A, A->D • Bonus • 大小寫
字串陣列 • 字串陣列可以看作是一個二維的陣列: • 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個字元當作字串印出
字串陣列初始化 • char names[4][11]={"Michael","John","Maggie","McGyver"}; • char names[][11]={"Michael","John","Maggie","McGyver"};
作業七 • 參考hw7.doc • www.csie.ntu.edu.tw/~r93041/C