複習 int count=8; int* pt=&count; //等於 pt=&count, //不等於*pt=&count printf(“%d”,count); //得到9
複習 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
Class 6 字元與字串
字元 一個英文字母、數字或其他的符號 在記憶體中佔一個位元組 是一串文字(字串)的最小基本單位 ‘$’、‘!’、‘G’、‘l’ 都是一個字元 在記憶體中佔一個位元組 是一串文字(字串)的最小基本單位 要表示一個字元,用一對單引號’‘把該字元夾起來 char c='a';
字元與整數對應 每一個字元在記憶體中,其實可以當作是一個佔用1 byte的整數值 每一個整數值根據相對應的字元表,有其代表的字元 如果是3個字元 如果是一個整數 ‘1’ ‘2’ ‘3’ 123 49 50 51 1byte 4bytes
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 …
字元變數的宣告與設定 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 下面程式會印出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);
字元的輸出與輸入 printf()&scanf() getchar()&putchar() 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> 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是小寫字母,則傳回大寫,否則傳原值
課堂練習 用一個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 *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中 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字串倒置
範例練習 在第二次世界大戰中,德軍的通訊編碼被美國破解,以致於機密被美國竊聽而慘敗 德軍的編碼規則(假)如下:將訊息每個字母往後推兩位再傳出去,例如 A→C、B→D,而後面的 Y→A、Z→B,所有的訊息都是大寫字母 而收到訊息的則是將每個字母往前推兩位,例如 C→A、D→B,而前面的 A→Y、B→Z 假設你是美軍的情報軍,要快速編碼及解碼德軍的訊息,希望完成一個程式,第一個字元為+代表要編碼,第一個字元為-代表要解碼 如:輸入+FIRE後會輸出HKTG;輸入-UVQR後會輸出STOP
課堂練習 修改範例練習 編碼:往前推三位 解碼:往後推三位 Bonus A->X, D->A X->A, A->D 大小寫
字串陣列 字串陣列可以看作是一個二維的陣列: 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"}; \0 J o n g G y v r
作業七 參考hw7.doc www.csie.ntu.edu.tw/~r93041/C