[C 語言] 程式設計教學:如何使用C 字串(String) | 開源技術教學網

文章推薦指數: 80 %
投票人數:10人

前言學完陣列和指標後,就有足夠的預備知識學習C 字串。

C 語言沒有獨立的字串型別,而C 字串是以char 或其他字元(character) 為基礎型別的陣列,所以要有先前文章的. Togglenavigation開源教學精選項目C語言Golang資料結構網頁程式電子書籍現代C語言程式設計C語言應用程式設計多平台Objective-C程式設計跨平台CommonLisp程式設計社群媒體臉書粉絲團臉書社團推特GitHubGumroad本站資訊關於著作權免責聲明隱私權開源教學C程式設計如何使用C字串(String)最後修改日期為JUL24,2018前言學完陣列和指標後,就有足夠的預備知識學習C字串。

C語言沒有獨立的字串型別,而C字串是以char或其他字元(character)為基礎型別的陣列,所以要有先前文章的鋪陳才容易學習C字串。

C語言的字串方案在C語言中,常見的字串方案有以下數種:固定寬度字元陣列字元陣列(characterarray)寬字元陣列(widecharacterarray):使用wchar.h函式庫多字節編碼(multibyteencodings),像是Big5(大五碼)或GB2312等統一碼(Unicode):包括UTF-8、UTF-16、UTF-32等有些方案為等寬字元,有些方案則採不等寬字元編碼。

原本的字元陣列僅能處理英文文字,其他方案則是為了處理多國語文文字而産生的。

例如,在支援Unicode的終端機環境,可以透過wchar_t印出中文字串:#include #include intmain(void) { //Tricktoprintmultibytestrings. setlocale(LC_CTYPE,""); wchar_t*s=L"你好,世界"; printf("%ls\n",s); return0; } 由於本文的目的是了解字串的基本操作,我們仍然是以原先的字元陣列為準,本文不考慮多國語言的情境。

C字串微觀我們由"HelloWorld"字串來看C字串的組成:由上圖可知,C字串除了依序儲存每個字元外,在尾端還會額外加上一個'\0'字元,代表字串結束。

由於C字串需要尾端的'\0'字元來判斷字串結束,我們在處理字串時,別忘了在字串尾端加上該字元。

接下來,我們會介紹數個字串操作的情境。

由於C標準函式庫已經有string.h函式庫,在採作字串時應優先使用該函式庫,而非重造輪子;本文展示的程式僅供參考。

計算C字串長度計算字串長度時,不包含尾端的結束字尾,所以C字串"happy"的字串長度為5而非6。

可參考以下的範例程式碼:#include/*1*/ #include/*2*/ #include/*3*/ intmain(void)/*4*/ {/*5*/ chars[]="Hello";/*6*/ size_tsz=0;/*7*/ for(size_ti=0;s[i];i++){/*8*/ sz++;/*9*/ }/*10*/ assert(sz==strlen(s));/*11*/ return0;/*12*/ }/*13*/ 我們藉由走訪字串來計算字串的長度,這段動作位於第8行至第10行。

當字串走到尾端的零值時,s[i]會回傳零,這時迴圈會結束。

藉由走訪字串陣列一輪就可以知道字串長度。

複製C字串一般使用strcpy函式的範例,都是預先配置某個長度的字元陣列;本例略加修改,先動態計算來源字串的長度,再由堆積(heap)動態配置一塊新的字元陣列,將原本的字元逐一複製到目標字串即完成。

參考以下程式碼:#include/*1*/ #include/*2*/ #include/*3*/ #include/*4*/ #include/*5*/ intmain(void)/*6*/ {/*7*/ chars[]="HelloWorld";/*8*/ size_tsz_s=strlen(s);/*9*/ size_tsz=sz_s+1;/*Addtrailingzero.*//*10*/ char*out=malloc(sz*sizeof(char));/*11*/ if(!out){/*12*/ fprintf(stderr,"FailedtoallocateCstring\n");/*13*/ return1;/*14*/ }/*15*/ for(size_ti=0;i/*1*/ #include/*2*/ #include/*3*/ #include/*4*/ intmain(void){/*5*/ chars_a[]="Hello";/*6*/ chars_b[]="World";/*7*/ size_tsz_a=strlen(s_a);/*8*/ size_tsz_b=strlen(s_b);/*9*/ size_tsz=sz_a+sz_b+1;/*10*/ char*out=malloc(sz*sizeof(char));/*11*/ if(!out){/*12*/ fprintf(stderr,/*13*/ "FailedtoallocateCstring\n");/*14*/ return1;/*15*/ }/*16*/ for(size_ti=0;i/*1*/ #include/*2*/ intmain(void)/*3*/ {/*4*/ chara[]="happy";/*5*/ charb[]="happyhour";/*6*/ boolis_equal=true;/*7*/ char*p=a;/*8*/ char*q=b;/*9*/ while(*p&&*q){/*10*/ /*Unequalcharacter.*//*11*/ if(*p!=*q){/*12*/ is_equal=false;/*13*/ gotoEND;/*14*/ }/*15*/ p++;q++;/*16*/ }/*17*/ /*Unequalstringlength.*//*18*/ if(*p!=*q){/*19*/ is_equal=false;/*20*/ gotoEND;/*21*/ }/*22*/ END:/*23*/ assert(false==is_equal);/*24*/ return0;/*25*/ }/*26*/ 我們不希望影響原本的字元陣列,所以我們在第8行及第9行分別拷貝兩字元陣列的位址。

檢查字元陣列的動作位於第10行至第17行。

當字元不相等時,直接結束比較字元陣列的迴圈。

兩字元有可能部分相等,但兩者不等長。

所以我們在第19行至第21行檢查兩字元陣列的尾端是否相等。

在這裡我們不直接檢查字串長度,因為這樣會多走訪一輪字串。

我們先逐一檢查字元是否相等,在尾段則檢查兩字串長度是否相等。

尋找子字串尋找子字串的示意圖如下:本命題的想法相當簡單,我們逐一走訪原字串,在每個位置檢查是否符合子字串。

以下是參考實作:#include/*1*/ #include/*2*/ intmain(void)/*3*/ {/*4*/ /*Originalstring.*//*5*/ chars[]="Thequickbrownfoxjumpsoverthelazydog";/*6*/ /*Substring.*//*7*/ charss[]="lazy";/*8*/ boolis_found=false;/*9*/ char*p=s;/*10*/ while(*p){/*11*/ booltemp=true;/*12*/ char*q=p;/*13*/ char*r=ss;/*14*/ while(*q&&*r){/*15*/ if(*q!=*r){/*16*/ temp=false;/*17*/ break;/*18*/ }/*19*/ q++;r++;/*20*/ }/*21*/ if(!(*r)){/*22*/ is_found=true;/*23*/ break;/*24*/ }/*25*/ p++;/*26*/ }/*27*/ assert(is_found);/*28*/ return0;/*29*/ }/*30*/ 走訪原字串的迴圈位於第11行至第27行。

在走訪時,我們在每個位置逐一比較子字串是否相符。

比較子字串的迴圈位於第15行至第21行。

要注意每次走訪子字串時,都要重新拷貝字串的位址,才可以重覆走訪。

結語在本文中,我們學習數個字串相關的基本演算法。

學習這些演算法的目的不是要取代內建字串處理函式,而是要在沒有內建函式可用時,有能力自己實作新的函式。

電子書籍如果你覺得這篇C語言的技術文章對你有幫助,可以看看以下完整的C語言程式設計電子書:分享本文追蹤本站



請為這篇文章評分?