Microsoft PowerPoint - ch09_AEL0080.ppt

Similar documents
Microsoft Word - CH09

新版 明解C++入門編

内 容 提 要 指 针 持 久 动 态 内 存 分 配 字 符 串 ( 字 符 数 组 ) 2

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

C/C++语言 - C/C++数据

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Strings

CC213

C/C++基礎程式設計班

Microsoft Word - AEL 序.doc

新・明解C言語入門編『索引』

Microsoft PowerPoint - 20-string-s.pptx

C/C++基礎程式設計班

Microsoft PowerPoint - ch04_AEL0080.ppt

Microsoft PowerPoint - C-Ch10.ppt

c_cpp

第3章.doc

C 1

C/C++ 语言 - 循环

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

第1章

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Microsoft PowerPoint - ch12.ppt

untitled

Microsoft PowerPoint - ch11.ppt

3.1 num = 3 ch = 'C' 2

5. 閱 讀 下 文, 推 斷 內 最 適 合 填 入 的 詞 語 依 序 為 何? 人 也 真 是 一 個 絕 字, 一 邊 向 左, 一 邊 向 右, 一 副 的 樣 子, 偏 又 相 連 著, 各 說 各 話 各 走 各 路, 卻 又 人, 這 麼 一 個 簡 單 的 字, 竟 包 含 如 此

《计算概论》课程 第十九讲 C 程序设计语言应用

Microsoft PowerPoint - Class5.pptx

Microsoft Word - CPE考生使用手冊 docx

C 語言—陣列及字串

Microsoft PowerPoint - ch02_AEL0080.ppt

nooog

FY.DOC

Microsoft PowerPoint - C-Ch12.ppt

CC213

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

untitled

untitled

C++ 程式設計

CC213

untitled

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

ebook39-5

untitled

本章內容 2-1 陣列及陣列位址的計算一維陣列位址計算多維陣列位址計算 2-2 一維陣列的基本運算讀取 寫入 複製 輸出 插入資料 刪除 2-3 二維陣列及矩陣的儲存與運算矩陣輸出 矩陣轉置 矩陣相加 矩陣相乘 2-4 字串 ( 字元陣列 ) 計算字串長度 字串複製 字串比較 子字串擷取 2

Ps22Pdf

untitled

Microsoft Word - well_game.doc

C/C++语言 - 分支结构

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

untitled

Microsoft Word - C-pgm-ws2010.doc

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

C/C++基礎程式設計班

untitled

untitled

第1章


投影片 1

目 錄 摘 要... 1 壹 研 究 動 機... 1 貳 研 究 目 的... 1 參 文 獻 探 討... 1 肆 研 究 設 備 及 材 料... 2 伍 研 究 過 程 及 方 法... 2 陸 研 究 結 果... 6 柒 討 論 捌 結 論 玖 參 考 資 料 及

Microsoft PowerPoint - Class2.pptx

C

Microsoft Word cppFinalSolution.doc

Microsoft PowerPoint - ch03_AEL0080.ppt

2013 年 底 機 器 設 備 1,046,154 累 計 折 舊 - 機 器 設 備 196,154 重 估 價 盈 餘 850,000 (2) 減 損 前 資 產 帳 面 價 值 =$4,100,000-($4,100, ,000) 16=$3,859,375 資 產 價 值 減

全国计算机技术与软件专业技术资格(水平)考试

第1章

Microsoft PowerPoint - C-Ch11.ppt

nooog

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h

勞動條件檢查執行重點(雲林)_ [相容模式]

醋 水 法 在 水 盆 內 放 入 約 七 分 滿 的 水 與 1/2 到 1 小 杯 的 醋 量, 將 髒 襪 子 浸 泡 一 晚, 隔 天 再 丟 入 洗 衣 機, 就 能 洗 得 相 當 乾 淨 醋 有 殺 菌 除 臭 和 漂 白 功 效, 使 用 過 的 醋 水, 還 可 清 理 地 板,

穨 PDF

Microsoft Word - 完全手冊-課程.doc

第一冊 第四章 分裂與再統一 班級 座號 姓吊

第八﹑九章 I/O系統

字元意義備註 \n 換行字元 \t Tab \r 迴車鍵 Windows 系統中以 \r\n 代表換行 \ 單引號 \" 雙引號 \0 空字元 用來代表字串的結束 \\ 倒斜線 倒斜線被用做跳脫字元, 因此要用兩個倒斜線表示 表 3.2: 常用特殊字元 ( 二 ) 常用技巧 : 字元判斷在 ASCI


<4D F736F F D B0EABB79A4E5B8D5C344BBBCB065AAA9>


康體藝術

公共圖書館利用教育方案規劃之研究

2013_423WBD_HKPanel_JSC_01

第一章


第二章 簡介類別

Microsoft PowerPoint - 04-array_pointer.ppt

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

Microsoft PowerPoint - 10 模板 Template.pptx

提问袁小兵:

untitled

Strings

_汪_文前新ok[3.1].doc

硕士论文正文

93年度推薦甄選考古題

Microsoft Word - 第7章 类与对象.docx

Transcription:

9 字 串 子曰 : 質勝文則野, 文勝質則史 文質彬彬, 然後君子 論語論語.雍也第六雍也第六 標準的 C++ 提供了方便的程式庫, 讓我們能將 字串 視為獨立的單元, 以進行各種存取和剪接的處理 1/36 字串 9.1 9.2 9.3 9.4 9.5 字串的基本概念字串的輸入與輸出字串的處理字串的指標陣列字串處理在編碼上的應用 2/36

字串的基本概念 字串 (string) 是由雙引號 所包括起來的一串文字 : Hello! 嗨! 您好! Good boy. 字串除了文字部份外, 其後又多加了一個空字元 (NULL character), 做為字串的結束記號 3/36 字串在記憶體內的儲存方式 H e l l o! \0 嗨! 您好! \0 G o o d b o y. \0 4/36

字串的宣告方式 char S1[20] = ello, 您好!? // 陣列式的 宣告 char S2[] = ello, 您好!? // 自動設定字元陣列的長度為 13 char* ps2 = ello, 您好!? // 指標式的宣告,C-style string 字串的資料型態為 char * 5/36 以一維陣列的方式逐一列舉字元定義字串 char S3[] = {???????? \0 ; char S4[10] = {\n?????, \0 ; 6/36

以指標的方式定義字串 char* ps2 = 嗨! 您好!? char* ps = {?? ; // 錯誤! 這個敘述在執行時發生了兩件事情 : (1) 在記憶單元內存入字串 嗨! 您好! (2) 將此字串第一個字元的位址存入指標 ps2 裏面 如下圖所示 : p S2 嗨! 您好! \0 7/36 先後儲存兩個字串 char* ps2 = 嗨! 您好!? ps2 = ood boy.? ps2 嗨! 您好! \0 G o o d b o y. \0 8/36

字元和字串的輸出入相關函數及管道 iostream 標準函數或管道功能 cout cin cin.getline() cin.get() 輸出資料流輸入資料流字串輸入函數字元輸入函數 9/36 10/36 字串的輸出指令 char S1[20] = ello, 您好!? char* ps = S1; 以下各種輸出敘述都得到同的字串 : cout << S1; cout << ps; cout << &S1[0]; cout << &ps[0]; cout 在遇到字串的指標或是字串的起始位址時, 會自動將輸出改為字串的內容, 而不是將位址輸出

輸出字串的位址 必需使用下列特殊語法 : cout << (void *)S1; cout << (void *)ps; 11/36 字串的輸入指令 cin 輸入資料流在遇到空隔, 或新行符號都會停止 如果要輸入 Hello 您好! 的字串時, 必須分兩次擷取 : char S1[20], S2[20]; cin >> S1 >> S2; 可以改用函數 cin.getline() 它的參數有三個 : cin.getline( 字串名稱, 最大字串長度, 結束字元 ); 其中 結束字元 的預設值是 '\n cin.getline(s1, 20); // 輸入字串並存入 S1 12/36

cin.get() 函數 cin.get() 一次只能輸入一個字元 : char C1; cin.get(c1); // 輸入字元並存入 C1 13/36 範例程式 BasicString.cpp (1/2) // BasicString.cpp #include <iostream> using namespace std; // --- 主程式 ------------------------ int main() { const int SLength = 20; char S1[SLength] = "Hello, 您好!"; int I[5]={1, 2, 4, 5, 6}; char* ps; int* pi=i; ps=s1; cout << "S1 is: " << S1 << endl; cout << "ps is: " << ps << endl; 14/36

範例程式 BasicString.cpp (2/2) cout << "I is: " << I << endl; cout << "pi is: " << pi << endl; cout << "*S1 is: " << *S1 << endl; cout << "&S1[0] is: " << &S1[0] << endl; cout << "S1[0] is: " << S1[0] << endl; cout << "(void*)s1[0] is: << (void*)s1[0] << endl; cout << "(void*)s1 is: " << (void*)s1 << endl; cout << "\n 請輸入 S1 的新值 :\n"; cin.getline(s1,slength); cout << " 輸入新值後, S1 的值為 : \n" << S1 << endl; return 0; } 15/36 操作結果 S1 is: Hello, 您好! ps is: Hello, 您好! I is: 0012FF1C pi is: 0012FF1C *S1 is: H &S1[0] is: Hello, 您好! S1[0] is: H (void*)s1[0] is: 00000048 (void*)s1 is: 0012FF30 請輸入 S1 的新值 : As seen by you. 輸入新值後, S1 的值為 : As seen by you. 16/36

字串的處理 const Length = 40; char S1[Length] = ood luck!? char* ps = S1; 字串 S1 的第 4 個字元 ( 亦即 'd? 可以使用下列四種寫法來存取 : S1[3] *(S1+3) ps[3] *(ps+3) 17/36 常用的字串處理函數 ( 需要標頭檔 <cstring>) 函數名稱 功 能 strlen( 字串 ) 求出不包括 '\0 的字串長度 strcpy( 字串 1, 字串 2) 將 字串 2 的內容複製到 字串 1 內 strcat( 字串 1, 字串 2) 將 字串 2 銜接到 字串 1 之後 strcmp( 字串 1, 字串 2) strchr( 字串, 字元 ) 將 字串 1 和 字串 2 作比較 如果 ( 字串 1 < 字串 2) 則輸出負整數如果 ( 字串 1 = = 字串 2) 則輸出 0 如果 ( 字串 1 > 字串 2) 則輸出正整數 尋找字串中第一個與指定的字元相同處的位址 18/36

範例程式 - 檔案 tringproc.cpp (1/3) // StringProc.cpp #include <iomanip> #include <iostream> #include <cstring> using namespace std; // --- 主程式 ------------------------ int main() { const int SLength = 20; char S1[SLength] = "Hello, 您好!"; char S2[SLength] = "Good boy."; char *ps1, *ps2; ps1=s1; ps2=s2; 19/36 檔案 tringproc.cpp (2/3) cout << "\n" << "ps1 的值為 : " << ps1 << "\n" << "ps1 的長度為 : " << strlen(ps1) << " 字元." << endl; cout << "\n" << "S1 的值為 : " << S1 << "\n" << "S1 的長度為 : " << strlen(s1) << " 字元." << endl; cout << "\n" << "ps2 的值為 : " << ps2 << "\n" << "ps2 的長度為 : " << strlen(ps2) << " 字元." << endl; 20/36

檔案 tringproc.cpp (3/3) strcat(s1, S2); cout << " 執行 strcat(s1, S2); 後," << "S1 的值為 : \n" << S1 << endl; cout << " 執行 strcmp(s1, S2); 的值為 : " << strcmp(s1, S2) << endl; char* p = strchr(s1, 'l'); cout << " 第 1 個 'l' 位於 S1 的第 " << (p - ps1)+1 << " 個字元的位置 " << endl; cout << " 執行 strchr(s1, 'l'); 的值為 : " << strchr(s1, 'l') << endl; strcpy(s1, S2); cout << " 執行 strcpy(s1, S2); 後," << "S1 的值為 : \n" << S1 << endl; 21/36 return 0; } 操作結果 ps1 的值為 : Hello, 您好! ps1 的長度為 : 12 字元. S1 的值為 : Hello, 您好! S1 的長度為 : 12 字元. ps2 的值為 : Good boy. ps2 的長度為 : 9 字元. 執行 strcat(s1, S2); 後,S1 的值為 : Hello, 您好!Good boy. 執行 strcmp(s1, S2); 的值為 : 1 第 1 個 'l' 位於 S1 的第 3 個字元的位置執行 strchr(s1, 'l'); 的值為 : llo, 您好!Good boy. 執行 strcpy(s1, S2); 後, S1 的值為 : Good boy. 22/36

字串與數字的轉換 (conversion between strings and numbers) 標準字串轉換函數 ( 需要標頭檔 <cstdlib>) 23/36 函數名稱功能 atoi( 字串 ) atof( 字串 1, 字串 2) itoa( 整數, 字串, 基底 ) 將字串轉成整數, 遇到非數字字元時, 停止轉換 將字串轉 double 數字, 遇到非數字或小數點字元時, 停止轉換 將整數轉成以基底為進位數的 ASCII 字串 例如基底為 10 表示十進位數字 範例程式 St2Num.cpp (1/2) 示範了 atoi(),atof(), 和 itoa() 共 3 個函數的用法 24/36 // St2Num.cpp #include <iomanip> #include <iostream> #include <cstdlib> using namespace std; // --- 主程式 ------------------------ int main() { const int SLength = 20; char S1[SLength] = " 320"; char S2[SLength] = " 60.5"; char *ps1, *ps2; int Num = 365;

範例程式 St2Num.cpp (2/2) ps1=s1; ps2=s2; cout << "\n320 + 5 的值為 : " << atoi(ps1)+5 << endl; cout << "\n60.5 + 5 的值為 : " << atof(ps2)+5 << endl; } itoa(num, S2, 10); cout << "\ns2 的值 ( 十進位 ) 為 : " << S2 << endl; itoa(num, S2, 16); cout << "\ns2 的值 ( 十六進位 ) 為 : 0x" << S2 << endl; itoa(num, S2, 2); cout << "\ns2 的值 ( 二進位 ) 為 : " << S2 << endl; return 0; 25/36 操作結果 320 + 5 的值為 : 325 60.5 + 5 的值為 : 65.5 S2 的值 ( 十進位 ) 為 : 365 S2 的值 ( 十六進位 ) 為 : 0x16d S2 的值 ( 二進位 ) 為 : 101101101 26/36

27/36 標準字元檢查與轉換函數 ( 需要標頭檔 <cctype>) 函 數 功 能 ( 假設 ch 是個 char 資料 ) isalpha(ch) 判斷 Ch 是否為英文字母 isupper(ch) 判斷 Ch 是否為大寫英文字母 islower(ch) 判斷 Ch 是否為小寫英文字母 isdigit(ch) 判斷 Ch 是否為 0 至 9 的數字 isascii(ch) 判斷 Ch 是否為 ASCII 字元 isspace(ch) 判斷 Ch 是否為空白間隔 isprint(ch) 判斷 Ch 是否為可以印出來或看得見的字元 iscntrl(ch) 判斷 Ch 是否為控制字元 ispucnt(ch) 判斷 Ch 是否為標點符號字元 toupper(ch) 如果 Ch 為小寫, 則將其轉為大寫英文字母 tolower(ch) 如果 Ch 為大寫, 則將其轉為小寫英文字母 範例程式 CharConv.cpp (1/2) 示範字元的大小寫轉換和判斷的函數 toupper() 和 isalpha() 的使用方式 // CharConv.cpp #include <iomanip> #include <iostream> #include <cctype> using namespace std; // --- 主程式 ------------------------ int main() { const int SLength = 60; char S1[SLength], Ch; cout << " 請輸入一句英文 :" << endl; cin.getline(s1,slength); 28/36

範例程式 CharConv.cpp (1/2) } for (int i=0; S1[i]!='\0';i++) S1[i] = toupper(s1[i]); cout << " 此句英文轉成大寫後是 :\n" << S1 << endl; cout << " 請輸入一個字元 :" << endl; Ch = cin.get(); if (isalpha (Ch)) cout << " 您輸入了一個英文字母 " << endl; else cout << " 您輸入的不是英文字母 " << endl; return 0; 29/36 操作結果 請輸入一句英文 : How I love you 此句英文轉成大寫後是 : HOW I LOVE YOU! 請輸入一個字元 : g 您輸入了一個英文字母 30/36

字串的指標陣列 把具有相同特質的一群字串以指標陣列 (pointer array) 來代表 : const Number = 3; char* Classmates[Number] = { 丁大丙 ", 林昱為 ", 丁小雨 "}; 使用 Classmates[i] 可以取用第 i 個成員 cout << 班上同學的名單是 :\n? for (int i=0; i<number; i++) cout << Classmates[i] << \n? 31/36 範例程式檔案 StringPArray.cpp (1/2) 32/36 // StringPArray.cpp #include <iomanip> #include <iostream> using namespace std; // --- 函數 FindSeason() 的宣告 --------------- char* FindSeason(int); // --- 主程式 ------------------------------- int main() { int Num; cout << "\n 請輸入一個月份 : " << endl; } cin >> Num; cout << "\n" << Num << " 月是 " << FindSeason(Num) << endl; return 0;

檔案 StringPArray.cpp (1/2) // --- 函數 FindSeason() 的定義 -------------- char* FindSeason(int Month) { int N; char* Seasons[]={" 冬季 "," 春季 "," 夏季 "," 秋季 "}; if (Month < 1 Month >12) return "( 您輸入的月份沒有意義 )"; N =(Month%12)/3; return Seasons[N]; } 操作結果 33/36 請輸入一個月份 : 9 9 月是秋季 範例程式檔案 EncodeText.cpp (1/3) 34/36 將英文字母依對照表轉換後輸出, 對於其他不是英文字母的符號則以空白取代 // EncodeText.cpp #include <iomanip> #include <iostream> #include <cstring> using namespace std; // --- 函數 Encode() 的宣告 ------------------------- void Encode(char* ); // --- 主程式 -------------------------------------- int main() { const MaxLength=40; char InputString[MaxLength]; cout << "Please input your original code:\n"; cin.getline(inputstring, MaxLength);

檔案 EncodeText.cpp (2/3) Encode(InputString); cout << "The answer is:\n"; cout << InputString; return 0; } // --- 函數 Encode() 的定義 ------------------------- void Encode(char* String) { char Codes[28]="DOJKZCTMYPAWHUQNBVGSRFXLIE "; char ABC[28] ="ABCDEFGHIJKLMNOPQRSTUVWXYZ "; char abc[28] ="abcdefghijklmnopqrstuvwxyz "; 35/36 檔案 EncodeText.cpp (3/3) 36/36 int i, j, Size = strlen(string); for(i=0; i<size;i++) { j=0; while (String[i]!=ABC[j] && String[i]!=abc[j] && j<26) j++; String[i]=Codes[j]; } return; } 操作結果 Please input your original code: I love you The answer is: Y WQFZ IQR