Introduction to the C Programming Language 字串 (String)
字串 (String) 字串是一個結構性的資料型態,它的實施方式有兩種,一種是使用字元陣列結構,另一種是使用指標.[如下頁所示] 字串的結構與一維的字元陣列是一樣的,兩者的差別在於字串是以空字元‘\0’結束. 字串以空字元‘\0’來當作字串的結束值,它是函數處理字串所認定字串結尾的唯一方法. 1. ( C入門及Turbo系統 楊健貴著.9-3) 2. 宣告字元變數, 產生 一個大, 小寫字母,符號或數字等.(C 語言教學手冊 9-39) 若想要 “一連串字元” 就是字串. 可用字元陣列來處理.
字串 (String)-續1 字串的宣告 字元陣列結構 指標 char 字串變數名稱 [字元個數] ; 例: char s2[13]; /* 宣告字串變數 s2 ,最多13個字元(包含空字元)*/ char 字串變數名稱 [字元個數] = “字串常數” ; 例: char s2[ ]=“I like C”; /*宣告字串變數 s2 ,不指定長度 ,初值為字串常數“I like C.” */ char *字串指標變數名稱 ; 例: char *s2; /* 宣告字串指標變數 s2*/ char *字串指標變數名稱 = “字串常數” ; 例: char *s2=“I like C”; /*宣告字串指標變數 s2,初值為字串常數“I like C.” */ s2 字元陣列結構 I l i k e C \0 指標 ( C入門及Turbo系統 楊健貴著.9-3) 一. 以“字元陣列”結構來儲存字串:char s2[13] 宣告陣列有13個空間(bytes,一個字元佔1byte),可存放12個字元, 最後一個空間存放字串結束符號‘\0’. 二. 以陣列結構來儲存字串:char s2[ ]=“I like C.” 不指定長度,但當初值設定時,系統就 會自動將結束符號(‘\0’)傳進陣列的最後一個位址. 三. 以指標方式來實施字串:*char *s2=“I like C.” 它是利用系統的heap空間,將字串存到所配置 的heap空間,再由指標址到所配置的heap的起始位置. 四.字串的最大長度為65535個字元. 五. 無論以陣列結構或指標來宣告字串型態,欲單獨存取字串中的元素( 字元),可用:( C入門及Turbo系統 楊健貴著.9-11) a. s2[ i ] 陣列索引( i ). b. *(s2+ i ) 指標器指到起始位址加上位移( i )之位置. 六. (C 語言教學手冊 9-44) 使用字串陣列時, 由於每個字串的長度不一, 會造成陣列空間的浪費, 若想避免這種情形, (C 語言教學手冊 10-38) 可用指標陣列來解決. 指標陣列: 指標變數 + 陣列的宣告方式. ( 即, 在陣列名稱再加上依址取值運算子 ) I l i k e C \0
字串 (String)-續2 /* 印出字元及字串的長度 */ #include <stdio.h> int main(void) { char a[]="My friend"; char b='c'; char str[]="c"; printf("sizeof(a)=%d\n",sizeof(a)); printf("sizeof(b)=%d\n",sizeof(b)); printf("sizeof(str)=%d\n",sizeof(str)); return 0; } (C 語言教學手冊 9-40) 1.檔名:str-size.c 執行結果: sizeof(a)=10 sizeof(b)=1 sizeof(str)=2 2.sizeof( ) (C 語言教學手冊 3-5) (C語言入門進階 位元編著 松崗出版 的p4-24.) 格式: sizeof( 資料型態名稱 ) or sizeof ( 變數名稱 ) 功能: 計算 資料型態名稱或變數 在記憶體中所佔的位元組大小. 亦即求算 資料型態名稱或變數 長度.
字串 (String)-範例一 範例一: 以字元陣列及字元指標變數表示字串 #include<stdio.h> main( ) { int i; char s1[13]; char s2[13]="I like C."; char *s3; char *s4="Thank you!"; printf("s2=%s\n",s2); printf(“s4=%s\n”,s4); /*印出字串指標變數s4所指的字串*/ for(i=0;i<13;i++) s1[i]=s2[i]; /*將s2 copy至s1*/ printf("s2=s1,then s1=%s\n",s1); s3=s4; printf(“s3=s4,then s3=%s\n”,s3); /*印出印出字串指標變數s3所指的字串*/ s3=s2; printf("s3=s2,then s3=%s\n",s3); printf("The 3nd character of s4 is '%c'. \n ",*(s4+2)); } 檔名 : s1-1.c 一.執行結果: s2=I like C. s4=Thank you! s2=s1,then s1=I like C. s3=s4,then s3=Thank you! s3=s2,then s3=I like C. s4's 3nd character is 'a' 二.參考來源 : C語言入門 (P.9-4)
字串 (String) -範例二 範例二: 示範字串資料的輸入與輸出 #include<stdio.h> main( ) { char *s1="I love C"; char *s2=“\0”; char s3[20]; char s4[]="I like C"; printf("The s1 are:%s\n",s1); printf("The s2 are:"); gets(s2); /*get string的意思, 定義在stdio.h*/ puts(s2); /*put string的意思, 定義在stdio.h*/ printf("Enter s3 string: "); scanf("%s",s3); printf("The s3 are:%s\n",s3); printf("The s4 are:%s\n",s4); } 檔名 : S2.c 一.執行結果: The s1 are:I love C The s2 are:I am a boy Enter s3 string:test The s3 are:test The s4 are:I like C 二.字串資料輸入,從鍵盤輸入的方式有兩種, 分別是scanf( )函數與gets( )函數, 三.以scanf( )函數的控制格式%s來輸入字串資料時, 字串中不能有空白字元. 四.若字串含有空白字元,則應以gets( ) 函數. 來做字串資料的輸入. gets( ) 於按下enter 後, 才會接收該字串,並存於指定的位置,並於字串結尾處加上字串結束字元(‘\o’). ( C語言教學手冊. 9-43) 五.puts( ) 會將字串的結束字元(‘\o’)轉換成 換行字元. 所以,在輸出一個字串後,會自動換行. ( C語言教學手冊. 9-43)
字串 (String) -範例二修正版 #include<stdio.h> main( ) { char *s1="I love C"; char m[10]; char *s2=m; char s3[20]; char s4[]="I like C"; printf("The s1 are:%s\n",s1); printf("The s2 are:"); gets(s2); /*get string的意思, 定義在stdio.h*/ puts(s2); /*put string的意思, 定義在stdio.h*/ printf("Enter s3 string: "); scanf("%s",s3); printf("The s3 are:%s\n",s3); printf("The s4 are:%s\n",s4); system("pause"); }
字串 (String) -範例三 s a b c d e f g \0 $ + t i j k l m n o p \0 $ + 範例三: 示範字串參數以call by address傳遞 #include<stdio.h> main( ) { void change(char *); char s[ ]="abcdefg"; char *t="ijklmnop"; change(s); change(t); puts(s); puts(t) } void change(char *x) *(x+2)='$'; *(x+5)='+'; s a b c d e f g \0 $ + t i j k l m n o p \0 $ + 檔名 : S3.c 一.執行結果: Ab$de+g Ij$lm+op 二.字串參數的傳遞是以call by address的方式進行 三.在函數中更改某一個字元,回到主程式時,其字串中之字元也被更改了. 四.參考資料:C入門與Turbo系統 P.9-12至P.9-15
字串 (String) -範例三修正版 #include<stdio.h> main( ) { void change(char *); char s[ ]="abcdefg"; char m[]="ijklmnop"; char *t=m; change(s); change(t); puts(s); puts(t); system("pause"); } void change(char *x) *(x+2)='$'; *(x+5)='+';
字串 (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值), 傳回一個函數值: 函數值<0str1<str2 函數值=0str1=str2 函數值>0str1>str2 strlen( ) strlen(str1) 傳回str1的長度(含空白字元,但不含結束字元\0) strchr( ) strchr(str1,ch) 根據字元的ASCII值,與str1比對,若無相同的ASCII值,則傳回空指標;若比對相同,則將出次出現的位址傳回 strstr( ) strstr(str1,str2) 從str2開始與str1比對,若無一樣的子字串,則傳回空指標;若一樣,則傳回str1比對一樣的位址 Go Go Go Go 一.字串連結:strcat ; strncat 二.字串複製:strcpy ; strncpy 三.字串比較:strcmp 四.字串長度:strlen 五.字串搜尋:strchr ; strstr Go Go Go
字串(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
字串(String)-常用的String Library Function -範例五 範例五: strncat( ) #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
字串(String)-常用的String Library Function -範例六 範例六: strcpy( ) #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
字串(String)-常用的String Library Function -範例七 範例七: strncpy( ) #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
字串(String)-常用的String Library Function -範例八 範例八: strcmp( ) #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)= -5 二.s1<s2,所以傳回值是負數, s1的‘e’ ASCII碼為65(16進位), s2的‘j’ASCII碼為6A(16進位),6A-65=5 a(97) – f(102) = -5
字串(String)-常用的String Library Function -範例九 範例九: strlen( ) #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
字串(String)-常用的String Library Function -範例十 範例十: strchr( )及strstr #include<stdio.h> #include<string.h> main( ) { char *p,*q,*s3="am"; int ch1='K'; char *s1="I am OK"; char *s2="I am OK"; p=strchr(s1,ch1); q=strstr(s2,s3); printf("s1 search 'a'=%s ; s2 search 'am'=%s\n",p, q); printf("s1 search ‘K‘ index=%d ; s2 search 'am‘ index=%d\n",p-s1,q-s2); system("pause"); } 檔名 : S10.c 執行結果: s1 serach 'a'=am OK ; s2 search 'am'=am OK 二.p=strchr(s1,ch1) ch1的值在s1字串中,從頭找尋並傳回. 三.q=strstr(s2,ch2) ch2字串在s2字串中,從頭尋找並傳回.