280 likes | 418 Views
主題 : 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).
E N D
主題: 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) • 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
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
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
strcmp(str1, str2) • 比較 str1 以及 str2 的大小 • 從第一個字母開始,一個一個比較 ASCII Code的大小,直到分出勝負或是確定兩個字串相同 str1 = = = < str2 註: “abc” < “abcde”
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
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
strchr(str1, c) • 回傳 str1 中,字元 c 第一次出現的位址 p = strchr(str1, ‘s’); p - str1 is the index 回傳 106
把 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
strstr(str1, str2) • 回傳 str1 中, str2 第一次出現的位址 p = strstr(str1, “is”); 回傳 105
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
p = strtok(str1, “ ”); 將107 改成 ‘\0’ p = strtok(NULL, “ ”); 將108, 109, 112 改成 ‘\0’ 回傳 103 回傳 110
strtok 注意事項 • 從第二次起改傳入 NULL • 會改變原本字串的內容 • s2 中可以填入多個字元 • strtok(str1, “,. ”);
其他有用的 functions • 下面函數需 include<ctype.h>,所有函數錯誤回傳 0,否則正確 • isalpha(c) //判斷 c 是否英文字母 • islower(c) //判斷 c 是否小寫英文字母 • isupper(c) //判斷 c 是否大寫英文字母 • isdigit(c) //判斷 c 是否數字 ‘0’ ~ ‘9’ • isspace(c) //判斷 c 是否為空白
例題講解: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
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
需要的資料結構 • char c • 每次讀入一個 character • int num • 處理中的數字 • int sum • 總和
解法 • 保留數字 • 將所有讀到的非數字的字母省略 • 第一個數字字母出現時,開始儲存,直到下一個非數字字母出現,將儲存的數字加入總和,並印出該數字 • 重複第二步直到檔案結尾 • 輸出總和
Example Asdf j213k as kfjas 932kk s8aklsd Asd klfj 823kjds 23ksad f9ksdaf asdfj89as df8kasdf
將連續的數字字母轉換成數字 if(isdigit(c) != 0) { num = num*10 + (c - '0'); }
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); //印出總和
flag • 如何將加號及等號印在正確的地方? • 利用 flag來輔助程式設計 • flag = 0: 尋找第一個數字中 • flag = 1: 看到第一個數字,處理中 • flag = 2: 尋找其它數字中 • flag = 3: 看到其它數字,處理中 • 1 2, 3 2: 印數字 • 2 3: 印 ‘+’ • 讀到檔案結尾,印 ‘=’ 及總和
印數字 213 印加號 印數字 932
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()
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() 填入
歷年題目 • 練習題 • 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 • 其他歷年題目 • 無