主題 : String functions

28
1 主主 : String functions 主主主主 String functions 主主主主 : H.88.1 主主主主

description

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

Transcript of 主題 : String functions

Page 1: 主題 : String functions

1

主題 : String functions 解題技巧

String functions 例題講解 : H.88.1 歷年題目

Page 2: 主題 : String functions

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;}abcoutput

Page 3: 主題 : String functions

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;}

helucsoutput

Page 4: 主題 : String functions

4

strcat(str1, str2) 將 str2 接至 str1 的後面

#include<string.h>main(){ char str1[100] = “abc”; strcat(str1, “def”); // 將 “ def” 接到 str1 後 printf(“%s”, str1); return 0;}abcdefoutput

Page 5: 主題 : String functions

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;}abcdeoutput

Page 6: 主題 : String functions

6

strcmp(str1, str2) 比較 str1 以及 str2 的大小

從第一個字母開始,一個一個比較 ASCII Code 的大小,直到分出勝負或是確定兩個字串相同w e l c o m e

w e l l

= = = <

str1

str2

註 : “abc” < “abcde”

Page 7: 主題 : String functions

7

strcmp(str1, str2) 回傳值return value description

< 0 str1 < str2

0 str1 = str2

> 0 str1 > str2

Page 8: 主題 : String functions

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;}5output

Page 9: 主題 : String functions

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;}

123output

Page 10: 主題 : String functions

10

strchr(str1, c) 回傳 str1 中,字元 c 第一次出現的位址位址 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

T h i s i s a t e s t \0

p = strchr(str1, ‘s’);

回傳 106 p - str1 is the index

Page 11: 主題 : String functions

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 tests a testst

Page 12: 主題 : String functions

12

strstr(str1, str2) 回傳 str1 中, str2 第一次出現的位址

位址 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

T h i s i s a t e s t \0

p = strstr(str1, “is”);

回傳 105

Page 13: 主題 : String functions

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

Page 14: 主題 : String functions

14

位址 103 104 105 106 107 108 109 110 111 112 113 114 115

T h i s i s a …

p = strtok(str1, “ ”);將 107 改成 ‘ \0’

回傳 103

p = strtok(NULL, “ ”);將 108, 109, 112 改成 ‘ \0’

回傳 110

Page 15: 主題 : String functions

15

strtok 注意事項 從第二次起改傳入 NULL 會改變原本字串的內容 s2 中可以填入多個字元

strtok(str1, “,. ”);

Page 16: 主題 : String functions

16

其他有用的 functions 下面函數需 include<ctype.h> ,所有函數錯誤回傳 0 ,否則正確

isalpha(c) // 判斷 c 是否英文字母 islower(c) // 判斷 c 是否小寫英文字母 isupper(c) // 判斷 c 是否大寫英文字母 isdigit(c) // 判斷 c 是否數字 ‘ 0’ ~ ‘9’ isspace(c) // 判斷 c 是否為空白

Page 17: 主題 : String functions

17

例題講解 : H.88.1(http://www.cc.nccu.edu.tw/info_race88/Q.pdf)

讀一個文字檔,將檔案中出現的數字相加,將整個式子印出,並輸出總和 Input File

in_a.txt Output File

out_a.txt

Page 18: 主題 : String functions

18

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

Sample Input

Sample Output 213+932+8+823+23+9+89+8=2105

Sample input/output

Page 19: 主題 : String functions

19

需要的資料結構 char c

每次讀入一個 character int num

處理中的數字 int sum

總和

Page 20: 主題 : String functions

20

解法 保留數字

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

Page 21: 主題 : String functions

21

Example

Asdf j213k as kfjas 932kk s8aklsdAsd klfj 823kjds23ksad f9ksdafasdfj89as df8kasdf

2 21 210 + 1 = 213 2110 + 3 = 213

9 93 910 + 3 = 932 9310 + 2 = 932

Page 22: 主題 : String functions

22

if(isdigit(c) != 0) { num = num*10 + (c - '0'); }

將連續的數字字母轉換成數字

Page 23: 主題 : String functions

23

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

Page 24: 主題 : String functions

24

如何將加號及等號印在正確的地方 ? 利用 flag 來輔助程式設計

flag = 0: 尋找第一個數字中 flag = 1: 看到第一個數字,處理中 flag = 2: 尋找其它數字中 flag = 3: 看到其它數字,處理中

1 2, 3 2: 印數字 2 3: 印 ‘ +’ 讀到檔案結尾,印 ‘ =’ 及總和

flag

Page 25: 主題 : String functions

25

A s d f j 2flag 0 0 0 0 0 0 1

1 3 k a sflag 1 1 2 2 2 2 2

k f j a s 9flag 2 2 2 2 2 2 3

3 2 k k s 8flag 3 3 2 2 2 2 3

印數字 213

印數字 932

印加號

Page 26: 主題 : String functions

26

if(flag == 0 || flag == 2) /* 前面是英文字母或檔案開頭 */ { if(flag == 2) printf(“+”); // 前面印過數字,先印加號 flag = flag+1; // 0 變成 1 , 2 變成 3}num = num * 10 + (‘c’ – ‘0’);

if(flag == 1 || flag == 3) { /* 只有前面是數字, flag 才設成 1 or 3 ,此時印數字 */ flag = 2; /* 告訴下一個字元,前面讀的不是數字 */ printf(“%d”, num); //output sum = sum + num; num = 0; // 重設 num}

non_digit()

digit()

Page 27: 主題 : String functions

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() 填入

Page 28: 主題 : String functions

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

其他歷年題目 無