1 / 28

主題 : String functions

主題 : String functions. 解題技巧 String functions 例題講解 : H.88.1 歷年題目. strcpy(str1, str2). copy str2 中的內容至 str1. #include<string.h> main() { char str1[100]; strcpy(str1, “abc”); //copy “abc” 到 str1 printf(“%s”, str1); return 0; }. abc. output. strncpy(str1, str2, num).

carter
Download Presentation

主題 : String functions

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 主題: String functions • 解題技巧 • String functions • 例題講解: H.88.1 • 歷年題目

  2. strcpy(str1, str2) • copy str2 中的內容至str1 • #include<string.h> • main() • { • char str1[100]; • strcpy(str1, “abc”); //copy “abc” 到str1 • printf(“%s”, str1); • return 0; • } • abc output

  3. strncpy(str1, str2, num) • copy str2 的前 num 個字元至str1最前面 • #include<string.h> • main() • { • char str1[100] = "nthucs"; • strncpy(str1, “hello”, 3); • //copy “hel” 到str1 最前面 • printf(“%s”, str1); • return 0; • } output • helucs

  4. strcat(str1, str2) • 將 str2 接至 str1的後面 • #include<string.h> • main() • { • char str1[100] = “abc”; • strcat(str1, “def”); //將 “def” 接到 str1 後 • printf(“%s”, str1); • return 0; • } • abcdef output

  5. strncat(str1, str2, num) • 將 str2 前 num 個字元接至 str1的後面 • #include<string.h> • main() • { • char str1[100] = “abc”; • strncat(str1, “def”, 2); //將 “de” 接到 str1 後 • printf(“%s”, str1); • return 0; • } • abcde output

  6. strcmp(str1, str2) • 比較 str1 以及 str2 的大小 • 從第一個字母開始,一個一個比較 ASCII Code的大小,直到分出勝負或是確定兩個字串相同 str1 = = = < str2 註: “abc” < “abcde”

  7. strcmp(str1, str2) 回傳值

  8. strlen(str1) • 計算 str1 的長度 • #include<string.h> // string function 需要的標頭檔 • main() • { • char str1[100] = “abcde”; • int len; • len = strlen(str1); //計算str1 的長度並存到len 中 • printf(“%d”, len); • return 0; • } output • 5

  9. atoi(str1) • 將 str1 含的數字字串轉成數字並回傳 • #include<string.h> // string function 需要的標頭檔 • main() • { • char str1[100] = “123”; • int i; • i = atoi(str1); //將 “123”轉成 int 存入 i • printf(“%d”, i); • return 0; • } output • 123

  10. strchr(str1, c) • 回傳 str1 中,字元 c 第一次出現的位址 p = strchr(str1, ‘s’); p - str1 is the index 回傳 106

  11. 把 str1 中所有 ‘s’出現的位址找出 #include <string.h> int main () { char str1[] = “This is a test”, *p; p = strchr(str1, ‘s’); while (p != NULL) { printf("%s\n", p); p = strchr(p + 1, ‘s’); //向後移動指標 } return 0; } Output s is a test s a test st

  12. strstr(str1, str2) • 回傳 str1 中, str2 第一次出現的位址 p = strstr(str1, “is”); 回傳 105

  13. strtok(str1, s2) • 將 str1 以字串 s2 中的任一字元切開 #include<string.h> int main() { char *p, str1[] = “This is a demo for strtok ”; p = strtok(str1, “ “); while (p != NULL) { printf(“%s\n”, p); p = strtok(NULL, “ “); } return 0; } //會依序列印出This, is, a, demo, for, strtok

  14. p = strtok(str1, “ ”); 將107 改成 ‘\0’ p = strtok(NULL, “ ”); 將108, 109, 112 改成 ‘\0’ 回傳 103 回傳 110

  15. strtok 注意事項 • 從第二次起改傳入 NULL • 會改變原本字串的內容 • s2 中可以填入多個字元 • strtok(str1, “,. ”);

  16. 其他有用的 functions • 下面函數需 include<ctype.h>,所有函數錯誤回傳 0,否則正確 • isalpha(c) //判斷 c 是否英文字母 • islower(c) //判斷 c 是否小寫英文字母 • isupper(c) //判斷 c 是否大寫英文字母 • isdigit(c) //判斷 c 是否數字 ‘0’ ~ ‘9’ • isspace(c) //判斷 c 是否為空白

  17. 例題講解:H.88.1(http://www.cc.nccu.edu.tw/info_race88/Q.pdf)例題講解:H.88.1(http://www.cc.nccu.edu.tw/info_race88/Q.pdf) • 讀一個文字檔,將檔案中出現的數字相加,將整個式子印出,並輸出總和 • Input File • in_a.txt • Output File • out_a.txt

  18. Sample input/output Asdf j213k as kfjas 932kk s8aklsd  Asd klfj 823kjds  23ksad f9ksdaf  asdfj89as df8kasdf Sample Input 213+932+8+823+23+9+89+8=2105 Sample Output

  19. 需要的資料結構 • char c • 每次讀入一個 character • int num • 處理中的數字 • int sum • 總和

  20. 解法 • 保留數字 • 將所有讀到的非數字的字母省略 • 第一個數字字母出現時,開始儲存,直到下一個非數字字母出現,將儲存的數字加入總和,並印出該數字 • 重複第二步直到檔案結尾 • 輸出總和

  21. Example Asdf j213k as kfjas 932kk s8aklsd Asd klfj 823kjds 23ksad f9ksdaf asdfj89as df8kasdf

  22. 將連續的數字字母轉換成數字 if(isdigit(c) != 0) { num = num*10 + (c - '0'); }

  23. Program structure flag = 0; sum = 0; //重設 flag 以及 總和 num = 0; while(scanf(“%c”, &c) == 1){ if(isdigit(c) != 0) /* 看到數字字元 */ digit(); else /*看到非數字字元*/ non_digit(); } non_digit(); // 對應最後一個字元是數字的情形 printf(“=%d”, sum); //印出總和

  24. flag • 如何將加號及等號印在正確的地方? • 利用 flag來輔助程式設計 • flag = 0: 尋找第一個數字中 • flag = 1: 看到第一個數字,處理中 • flag = 2: 尋找其它數字中 • flag = 3: 看到其它數字,處理中 • 1  2, 3  2: 印數字 • 2  3: 印 ‘+’ • 讀到檔案結尾,印 ‘=’ 及總和

  25. 印數字 213 印加號 印數字 932

  26. if(flag == 0 || flag == 2) /*前面是英文字母或檔案開頭*/ { if(flag == 2) printf(“+”); //前面印過數字,先印加號 flag = flag+1; // 0 變成 1,2 變成 3 } num = num * 10 + (‘c’ – ‘0’); digit() if(flag == 1 || flag == 3) { /*只有前面是數字,flag 才設成 1 or 3,此時印數字*/ flag = 2; /* 告訴下一個字元,前面讀的不是數字*/ printf(“%d”, num); //output sum = sum + num; num = 0; //重設 num } non_digit()

  27. Program #include <stdio.h> #include <ctype.h> #include <string.h> int main(void){ int num, flag, sum; char c; num = 0, flag = 0, sum = 0; while(scanf(“%c”, &c) == 1) { if(isdigit(c) != 0) digit(); /* 看到數字字母 */ else non_digit(); /*看到非數字字元 */ } non_digit(); // 對應最後一個字元是數字的情形 printf(“=%d”, sum); //印出總和 return 0; } 將前面的 digit(), non_digit() 填入

  28. 歷年題目 • 練習題 • H.88.1 • http://www.cc.nccu.edu.tw/info_race88/Q.pdf • H.88.4 • http://www.cc.nccu.edu.tw/info_race88/Q.pdf • 挑戰題 • A.175 Keywords • http://acm.uva.es/p/v1/175.html • A.581 Word Search Wonder • http://acm.uva.es/p/v5/581.html • 其他歷年題目 • 無

More Related