C/C++基礎程式設計班 字元與字串 講師:林業峻 CSIE, NTU 3/14, 2015
課程大綱 字元 字串 作業
字元 一個字元可存0~255 (1Byte) 電腦表示一個符號或文字的方法 C語言用單引號表示字元,並使用char變數儲存 給一個符號、文字一個編號 (ASCII字碼) 例: A 65, B 66, … , Z 90 a 97, b 98, … , z 122 0 48, 1 49, … , 9 57 + 43, - 45 C語言用單引號表示字元,並使用char變數儲存 char ch = 'A'; char ch = 65;
字元表
字元 getchar() putchar() 輸入字元 輸出字元 #include <stdio.h> int main() { char ch; ch = getchar(); putchar(ch); putchar('\n'); return 0; }
字元 getch() getche() 輸入字元, 不需按enter, 輸入內容不顯示於螢幕 #include <conio.h> int main() { char ch; ch = getch(); //比較使用getche() return 0; }
字元應用 判斷輸入字元是大寫英文, 小寫英文, 數字, 或其他 #include <stdio.h> int main() { char ch; ch = getchar(); if(ch>='0' && ch<='9') printf("你輸入了數字\n"); else if(ch>='A' && ch<='Z') printf("你輸入了大寫英文\n"); else if(ch>='a' && ch<='z') printf("你輸入了小寫英文\n"); else printf("你輸入了其他字元\n"); return 0; }
字元應用 將輸入的小寫英文轉成大寫英文 #include <stdio.h> int main() { char ch; ch = getchar(); if(ch>='a' && ch<='z') ch-=32; //或 ch-=('a'-'A'); printf("%c\n", ch); } else if(ch>='A' && ch<='Z') else printf("你輸入的不是英文字母\n"); return 0;
課程大綱 字元 字串 作業
字串 字串 一個字串使用一個一維字元陣列儲存 例: 宣告一個字元陣列並儲存一個"Hello"字串 一堆字元 + 字串結束字元'\0' "一堆字元" 一個字串使用一個一維字元陣列儲存 因此操作字串的語法等同於操作字元陣列的語法 例: 宣告一個字元陣列並儲存一個"Hello"字串 char a[]={'H', 'e', 'l', 'l', 'o', '\0'}; char a[]="Hello"; 位置: a 'H' 'e' 'l' 'l' 'o' '\0'
字串 以下a,b,c皆可表示Hello字串 #include <stdio.h> int main() { char a[]="Hello"; //字串初始化 char b[]={'H','e','l','l','o','\0'}; //字元陣列初始化 char c[6]; //字元陣列宣告 c[0]='H'; c[1]='e'; c[2]='l'; c[3]='l'; c[4]='o'; c[5]='\0'; // '\0'是字串的結束符號 printf("%s \n",a); //字串a輸出 printf("%s \n",b); //字串b輸出 printf("%s \n",c); //字串c輸出 return 0; }
字串輸入輸出 利用scanf來讀取一個字串在用printf印出 #include <stdio.h> int main() { char a[80]; scanf("%s", &a); //或用a printf("%s \n",a); return 0; }
字串輸入輸出 用scanf來讀字串, 字串中不能有空白. 若有空白會 被當成兩個不同的字串. gets(a) puts(a) 輸入字串存入字元陣列a, 以enter鍵做為字串結束 puts(a) 輸出字元陣列a中的字串 #include <stdio.h> int main() { char a[80]; gets(a); puts(a); return 0; }
字串輸入輸出 當scanf遇上gets 解法: 使用fflush(stdin); scanf輸入完後所按下之enter鍵會殘留在輸入緩衝區stdin(或 稱標準輸入檔), 將影響到下一次的gets輸入 解法: 使用fflush(stdin); #include <stdio.h> int main() { char a[80]; char b[80]; scanf("%s", a); //fflush(stdin); gets(b); //此gets無法正常輸入 printf("%s\n", a); printf("%s\n", b); return 0; }
指定輸入字串長度 可以指定輸入字串長度上限的函式 fgets(a, 長度, stdin) 輸入字串存入字元陣列a, 以enter鍵做為字串結束 長度: 儲存空間長度上限 (ps. 非字串長度) #include <stdio.h> int main() { char a[5]; fgets(a, 5, stdin); //只能輸入4個字元 puts(a); return 0; }
練習 輸入一字串將其中小寫字元轉成大寫字元 例如: 輸入abCdE123 輸出ABCDE123
使用二維陣列存放字串 當有多個字串要儲存,可以使用字元二維陣列 #include <stdio.h> int main() { int i; char name[3][80]; for(i=0; i<3; i++) //輸入三個人姓名 printf("姓名%d: ", i+1); gets(name[i]); } for(i=0; i<3; i++) //輸出三個人姓名 printf("姓名%d: %s\n", i+1, name[i]); return 0;
字串應用 C語言中提供許多字串相關函式可以使用, 以下介 紹常用的幾個函式: C語言字元字串函式參考網站 字串比對: strcmp 字串複製: strcpy 字串連接: strcat 計算字串長度: strlen C語言字元字串函式參考網站 http://www.cppreference.com/wiki/c/string/start http://www.cplusplus.com/reference/clibrary/cstring/
字串應用 字串原理: 字串用字元陣列儲存 陣列名稱: 陣列開頭之記憶體位置 因此, 字串處理 = 陣列處理 字串處理相當複雜, 但又太常用了, 因此C語言提供 了一些函式讓我們可以方便使用
字串比對錯誤用法! 下列程式可以執行, 但沒有意義 #include <stdio.h> int main() { char a[]="Hello"; char b[80]; scanf("%s", &b); if ( a==b ) printf("輸入字串正確\n"); } else printf("輸入字串錯誤\n"); return 0;
字串比對: strcmp strcmp(a, b): 比對a,b字串之內容 strcmp(a,b) > 0 : a字串字母順序較大 strcmp(a,b) < 0 : b字串字母順序較大 strcmp(a,b) == 0 : a,b兩字串內容一樣 #include <stdio.h> #include <string.h> int main() { char a[80]="Hello"; char b[80]; scanf("%s", &b); if ( strcmp(a,b)==0 ) printf("輸入字串正確\n"); } else printf("輸入字串錯誤\n"); return 0;
字串比對: strcmp 範例: 比較兩個字串內容 #include <stdio.h> #include <string.h> int main() { char a[80]; char b[80]; printf("輸入第一個字串: "); scanf("%s", &a); printf("輸入第二個字串: "); scanf("%s", &b); if ( strcmp(a,b) > 0 ) printf("輸入第一個字串字母順序較大\n"); } else if ( strcmp(a,b) < 0 ) printf("輸入第二個字串字母順序較大\n"); else printf("二個字串內容相同\n"); return 0;
字串複製錯誤用法! 下列程式不可執行 #include <stdio.h> int main() { char a[80]; char b[80]="How are you"; a = b; // 錯誤! a為記憶體位置, 為一個常數, 不可存放資料 printf("%s\n", a); return 0; }
字串複製: strcpy strcpy(a, b): 將b字串內容複製到a字串 #include <stdio.h> #include <string.h> int main() { char a[80]; char b[80]="How are you"; strcpy(a, b); printf("%s\n", a); return 0; }
字串連接錯誤用法! 下列程式不可執行 #include <stdio.h> int main() { char a[80]="Hi, "; char b[80]="how are you"; a+=b; // 錯誤! a為記憶體位置, 為一個常數, 不可存放資料 printf("%s\n", a); return 0; }
字串連接: strcat strcat(a, b): 將b字串內容加到a字串後面 #include <stdio.h> #include <string.h> int main() { char a[80]="Hi, "; char b[80]="how are you"; strcat(a, b); printf("%s\n", a); return 0; }
計算字串長度: strlen strlen(a): 計算a字串長度 #include <stdio.h> #include <string.h> int main() { char a[80]; int n; gets(a); n = strlen(a); printf("字串長度 = %d\n", n); return 0; }
課程大綱 字元 字串 作業
猜數字遊戲 輸入四位不重覆數字 (0~9), 做為電腦的題目 輸入四位不重覆數字 (0~9), 做為您猜的答案 不需檢查使用者輸入之格式 當輸入之答案與題目相同, 程式結束 遊戲規則 電腦的題目: 1234 您猜的數字: 5283 結果為 1A1B 表示您共猜對了兩位數, 其中有一個字位置對, 另一個字位置 不對 其中, A 表示猜對一個字且位置也對, B 表示猜對一個字但是位 置不對。
範例 http://www.csie.ntu.edu.tw/~d95027/train/download/guess.exe Enter the question: 1234 guess: 5283 1A1B guess: 5290 1A0B guess: 7890 0A0B guess: 1256 2A0B guess: 5634 guess: 1234 4A0B you win! bye! Press any key to continue
繳交 使用FTP上傳 請使用FileZilla上傳作業至指定FTP主機 繳交期限:2015. 3/21(六) 主機: 使用者名稱: 密碼: 連接埠: 將程式存到自己學號之資料夾 (請自行新增) 檔名: 251XX_hw2_##.c XX為學號, ##為版本編號 Ex: 25100_hw2_01.c (25100號同學 作業2 第1版) 請使用FileZilla上傳作業至指定FTP主機 繳交期限:2015. 3/21(六) 公佈解答後,不再收作業