Presentation is loading. Please wait.

Presentation is loading. Please wait.

深度學習C++ Chapter 7 簡易字串 深度學習 C++ 簡易字串.

Similar presentations


Presentation on theme: "深度學習C++ Chapter 7 簡易字串 深度學習 C++ 簡易字串."— Presentation transcript:

1 深度學習C++ Chapter 7 簡易字串 深度學習 C++ 簡易字串

2 傳統字串 固定長度的字元陣列 字串末尾字元為空字元(’\0’) 字串長度為空字元之前的所有字元個數 字元陣列長度一定要多於字串長度加一
C-style string 深度學習 C++ 簡易字串

3 傳統字串的設定 陣列長度為 20,字串長度為 3,用了 4 個字元 陣列長度為 20,字串長度為 9,用了 10 個字元
陣列長度為 4,字串長度為 3,字元總數為 4 字串長度為 4,但字元總數為 5,d 為常字串  char a[20] = { ’c’ , ’a’ , ’t’ , ’\0’ } ; char b[20] = ” ” ; char c[] = ”dog” ; char *d = ”fish” ; // a 為字串,第四個字元之後都是空字元 char a[20] = { ’c’ , ’a’ , ’t’ } ; // b 不是字串,為 3 個字元的字元陣列 char b[3] = { ’c’ , ’a’ , ’t’ } ; 深度學習 C++ 簡易字串

4 常字串與字元陣列 (一) 常字串內的資料不能在程式執行中被更改 若要更改字串,則須以字元陣列方式儲存字串 // 錯誤 // 正確
char *foo = ”fish” ; foo[0] = ’F’ ; 可在 char 之前使用 const 加以突顯常字串的常數特性 const char *foo = ”fish” ; char bar[] = ”fish” ; bar[0] = ’F’ ; // 正確 深度學習 C++ 簡易字串

5 常字串與字元陣列 (二) 指向常字串的指標,在執行中可隨時指向其他位址 字元陣列在執行中不可指向其他位址
char *a = ”horse” ; char *b = ”fish” ; a = b ; // 指標 a 指向常字串 horse // 指標 b 指向常字串 fish // 指標 a 指向指標 b 所指的位址,即指向 fish 以上的常字串 ”horse” 會因此失去連結,永遠無法為程式內的其他式子所使用 char a[] = ”horse” ; char b[] = ”fish” ; a = b ; // 字串陣列 a 存有 horse\0 // 字串陣列 b 存有 fish\0 // 錯誤 string literal 深度學習 C++ 簡易字串

6 常字串與中文字串 常字串可以使用 ’\’ 來斷行 常字串也可使用分號分開連結 中文字串:每個中文字以兩個字元代表。字串長度為中文 字數的兩倍
常字串可以使用 ’\’ 來斷行 常字串也可使用分號分開連結 中文字串:每個中文字以兩個字元代表。字串長度為中文       字數的兩倍 char *foo = ”123\ 456\ 7890” ; foo 指向 ” ” char foo[] = ”123” ”456” ; foo 儲存 ”123456” // 陣列長度為 19,字串長度 18 char foo[] = ”月明星稀,烏鵲南飛” ; 深度學習 C++ 簡易字串

7 常犯的錯誤字串設定 常犯錯誤的字串設定 如果使用字元指標設定,可能會造成字串失去連結 // 錯誤 foo 為字元陣列
// 錯誤 a 為陣列 // 錯誤 a 為陣列且長度不足 char foo[5] ; foo = ”tiger” ; foo = ”crocodile” ; char a[10] , b[10] , c[20] ; a = b ; a = c ; // 正確     // 正確 但原有的 ”tiger” 就失去連繫 char *p ; p = ”tiger” ; p = ”cat” ; char *r = ”sheep” ; char *s = ”dog” ; r = s ; // 正確 但原有的 ”sheep” 就失去連繫 深度學習 C++ 簡易字串

8 字元陣列的輸入與輸出 (一) 字串的輸入 字串的輸出 字串只能存入字元陣列內,且字串長度須比字元陣列長度少一個字元,以供空字元所使用
若要輸出字串,僅須使用字元陣列名稱或字元指標即可。 此時顯示的字元為空字元之前的所有字元 char a[20] ; cin >> a ; cout << a << endl; // 輸入最多 19 個字元      // 輸出在空字元之前的所有字元 深度學習 C++ 簡易字串

9 字元陣列的輸入與輸出 (二) 字串輸出的寬度可以使用 setw 設定 若字元陣列缺少空字元,則輸出的字元總數通常會超出陣列的字元總數
#include <iomanip> char a[10] ; cin >> a ; cout << setw(15) << a << endl ; char a[3] = {’c’ , ’a’ , ’t’} ; cout << a << endl ; // a 不是字串 // 語法正確但輸出錯誤 深度學習 C++ 簡易字串

10 使用字元指標輸入與輸出 字元指標可以用來指向字元陣列,有時也可以用來輸出字串。字元指標並沒有任何記憶空間用來儲存輸入的字元資料
char a[20] = ”horse” ; char *p = a ; cout << p << endl ; // 指標指向字元陣列 a // 列印:horse cin >> p ; cout << p << endl ; // 輸入一長度小於等於 19 的字串 // 列印輸入的字串 char *q ; cin >> q ; cout << q << endl ; // 定義新字元指標 // 錯誤:q 沒有分配任何記憶空間 深度學習 C++ 簡易字串

11 字元陣列的操作 (一) 傳統字串可以使用下標改變字元資料 將字串的資料分開列印 計算字串長度
字串長度可以使用於 string.h 標頭檔內的 strlen 函式求得 char a[20] = ”startrek” ; for ( int i = 0 ; a[i] != ’\0’ ; ++i ) cout << a[i] << ” ” ; char foo[50] = ”暮春三月,江南草長” ; int len = 0 ; while( foo[len] != ’\0’ ) ++len ; cout << ”字串長度 :” << len << endl ; // 字串長度 :18 #include <string.h> cout << ”字串長度 :” << strlen(”borg”) << endl ; // 印出 4 深度學習 C++ 簡易字串

12 字元陣列的操作 (二) 將字串內的小寫字母改成大寫 以上若使用 則程式將會產生執行錯誤,原因為字元指標所指向的字串為常字串
char p[] = ”The Lord of The Rings” ; for ( int i = 0 ; p[i] != ’\0’ ; ++i ) { if ( p[i] >= ’a’ && p[i] <= ’z’ ) p[i] = p[i] – ’a’ + ’A’ ; } cout << p << endl ; // 輸出:THE LORD OF THE RINGS char *p = ”The Lord of The Rings” ; 則程式將會產生執行錯誤,原因為字元指標所指向的字串為常字串 深度學習 C++ 簡易字串

13 傳統字串合併 字串合併 依次複製兩字串的所有非空字元到新字元陣列,最後再補上一個空字元 錯誤方式 c = a + b ; 正確方式
char a[] = ”暮春三月” ; char b[] = ”江南草長” ; char c[100] ; int i , j ; for ( i = 0 ; a[i] != ’\0’ ; ++i ) c[i] = a[i] ; for ( j = 0 ; b[j] != ’\0’ ; ++j ) c[i+j] = b[j] ; c[i+j] = ’\0’ ; 深度學習 C++ 簡易字串

14 字串 (String)-常用的String Library Function
C語言提供很多字串庫存函數,這些都存在string.h標頭檔裡 名稱 寫法 用途 strcat ( ) strcat(str1,str2) 將str2串接在str1之後 strncat ( ) strncat(str1,str2,n) 將str2的前面n個字元,串接在str1之後 strcpy ( ) strcpy(str1,str2) 將一個str2 複製到另一str1中 strncpy strncpy(str1,str2,n) 將str2前面 n個字元複製至str1字串 strcmp( ) strcmp(str1,str2) 將str1和str2由左至右依序比較其字元(根據ASCII值), 傳回一個函數值: 函數值<0str1<str2 函數值=0str1=str2 函數值>0str1>str2 strlen( ) strlen(str1) 傳回str1的長度(含空白字元,但不含結束字元\0) Go Go Go Go 一.字串連結:strcat ; strncat 二.字串複製:strcpy ; strncpy 三.字串比較:strcmp 四.字串長度:strlen 五.字串搜尋:strchr ; strstr Go Go

15 字串(String)-常用的String Library Function
範例四: strcat( ) #include<stdio.h> #include<string.h> main( ) { int i; char s1[40]="abcde"; char s2[40]="fghijk"; strcat(s1,s2); printf("The new string are=%s\n",s1); } s1 a b c d e \0 s2 f g h i j k \0 檔名 : S4.c 一.執行結果: The new string are=abcdefghijk 二.s1先去掉尾端的Null Character(‘\0’),再加上s2. s1 a b c d e f g h i j k \0

16 字串(String)-常用的String Library Function
#include<stdio.h> #include<string.h> main( ) { int i; char s1[40]="abcde"; char s2[40]="fghijk"; strncat(s1,s2,3); printf("The new string are=%s\n",s1); } s1 a b c d e \0 s2 f g h i j k \0 檔名 : S5.c 一.執行結果: The new string are=abcdefgh 二.s1先去掉尾端的Null Character(‘\0’),再加上s2前三個字元. s1 a b c d e f g h \0

17 字串(String)-常用的String Library Function
#include<stdio.h> #include<string.h> main( ) { int i; char s1[40]="abcde"; char s2[40]="fghijk"; strcpy(s1,s2); printf("The new string are=%s\n",s1); } s1 a b c d e \0 s2 f g h i j k \0 檔名 : S6.c 一.執行結果: The new string are=fghijk 二.將s2複製至s1中. s1 f g h i j k \0

18 字串(String)-常用的String Library Function
#include<stdio.h> #include<string.h> main( ) { int i; char s1[40]="abcde"; char s2[40]="fghijk"; strncpy(s1,s2,3); printf("The new string are=%s\n",s1); } s1 a b c d e \0 s2 f g h i j k \0 檔名 : S7.c 一.執行結果: The new string are=fghde 二.將s2前三個字元複製至s1前三個字元中. s1 f g h d e \0

19 字串(String)-常用的String Library Function
#include<stdio.h> #include<string.h> main( ) { int i,p; char s1[40]="abcde"; char s2[40]="fghijk"; p=strcmp(s1,s2); printf("strcmp(s1,s2)=%d\n",p); } s1 a b c d e \0 s2 f g h i j k \0 檔名 : S8.c 一.執行結果: strcmp(s1,s2)= -1 二.s1<s2,所以傳回值是負數 a(97) < f(102) => -1

20 字串(String)-常用的String Library Function
#include<stdio.h> #include<string.h> main( ) { int i,p,q; char s1[40]="abcde"; char s2[40]="fghijk"; p=strlen(s1); q=strlen(s2); printf("s1=%d;s2=%d\n",p,q); } 檔名 : S9.c 執行結果: s1=5,s2=6

21 C++ 字串 C++ 字串為一可自動調整字元長度的字元陣列, 字串長度沒有限制 C++ 字串長度就是真正的字元長度 C++ 字串末尾無空字元
須加入 string 標頭檔 C++-style string 深度學習 C++ 簡易字串

22 C++ 字串物件 字串物件 字串物件陣列 string a ; // a 字串沒有任何字元 string b(5 , ’z’);
string c = ”cat” ; // c 字串有 3 個字元,分別為’c’ ’a’ ’t’ string d(”cat”) ; // d 字串同上 string e = ’a’ ; // 錯誤,需改成 e = ”a” 字串 string f = d ; // f 字串與 d 字串相同 string a[10] ; // 10 個 C++ 字串元素所構成的字串陣列 深度學習 C++ 簡易字串

23 C++ 字串物件的輸入與輸出 直接使用 cin 輸入與 cout 輸出 簡單回聲 (echo) 程式
早期的 C++ 編譯器無法列印 C++ 字串,此時可以使用 .c_str() 讓此 C++ 字串以傳統字串方式輸出 string in ; while ( 1 ) { cin >> in ; cout << in << endl ; } string foo = ”tiger” ; cout << foo.c_str() << endl ; 深度學習 C++ 簡易字串

24 簡單 C++ 字串操作 (一) 字串指定: = 字串合成: + , += + 與 += 的右側也可以是字元 string foo ;
foo = foo + ”臥龍” ; // foo 的末尾加上一字串 foo += ”臥龍” ; // 相當於 foo = foo + ”臥龍” foo = ”孔明” + ”諸葛亮” ; // 錯誤,加法的兩側至少 // 要有一個為 C++ 字串 深度學習 C++ 簡易字串

25 簡單 C++ 字串操作 (二) 字串長度:.size() 或 .length() 字元讀取與更改:[] 產生傳統字串:.c_str()
cout << foo.length() << endl ; string foo = ”tiger” ; for ( int i = 0 ; i < foo.size() ; ++i ) { cout << foo[i] << ’ ’ ; } string foo = ”cat” ; cout << ”> 傳統字串:” << foo.c_str() << endl ; cout << ”> C++ :” << foo << endl ; 深度學習 C++ 簡易字串

26 字串陣列 (一) 字串陣列:陣列的元素為字串 1. 陣列有五個字串,每個字串有四個字元 2. 陣列有五個常字串,每個字串的大小由初始字串決定
3. 同上,但字串的個數由編譯器自己核算 4. 陣列字串個數由初始陣列的元素決定,每個字串的長度由初始字串決定 5. 陣列有五個 C++ 字串 char weekday[5][4] = {”mon”,”tue”,”wed”,”thu”,”fri”}; char * weekday[5] = {”mon”,”tue”,”wed”,”thu”,”fri”}; char * weekday[] = {”mon”,”tue”,”wed”,”thu”,”fri”}; char ** weekday = {”mon”,”tue”,”wed”,”thu”,”fri”}; string weekday[5] = {”mon”,”tue”,”wed”,”thu”,”fri”}; 深度學習 C++ 簡易字串

27 字串陣列 (二) 之前的 2. 3. 4. 等三種字串陣列的字串都是常字串 (string literal),無法在程式中加以改變字串內容
char * weekday[5] = { ”mon” , ”tue” , ”wed” , ”thu” , ”fri”} ; weekday[1][0] = ’T’ ; // 錯誤,無法將 ’t’ 改成 ’T’ 深度學習 C++ 簡易字串

28 字串陣列 (三) 修改字串陣列的元素 使用向量陣列儲存字串
char weekday[5][4] = {”mon”,”tue”,”wed”,”thu”,”fri”} ; for ( i = 0 ; i < 5 ; ++i) weekday[i][0] += ’A’ - ’a’ ; for ( i = 0 ; i < 5 ; ++i) cout << weekday[i] << ’ ’ ; int no ; cin >> no ; vector<string> foo(no) ; // 向量陣列內有 no 個 C++ 字串 // 將陣列內每個字串元素都複製成一樣 for( i = 0; i < 5; ++i) foo[i] = ”明月松間照,清泉石上流” ; 深度學習 C++ 簡易字串

29 字幕顯示器:跑馬燈 將輸出的文字以跑馬燈的方式顯示 使用 sleep() 函式讓程式暫時若干時間
使用 ’\r’ 字元讓游標重回同一行的第一個字元處 使用 flush 讓要輸出的資料立即顯示在螢幕 程式 輸出 深度學習 C++ 簡易字串

30 字串分解 分解長字串內的字 原字串: 分解成: ”Must you be so linear, Jean-Luc”
程式 輸出 深度學習 C++ 簡易字串

31 點矩陣文字字串 將輸入字串內的字元以點矩陣方式呈現 輸出: **** **** *** *** ** * * * * * * * *
輸入:ZEBRA 輸出: **** **** ***  ***   **    * *    *  * *  * *  *   *  ***  ***  ***  ****  *   *    *  * * *  *  * **** **** ***  *  * *  * 程式 輸出 深度學習 C++ 簡易字串


Download ppt "深度學習C++ Chapter 7 簡易字串 深度學習 C++ 簡易字串."

Similar presentations


Ads by Google