字元陣列與字串 - OpenHome.cc

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

字串就是一串文字,在C 談到字串的話,一個意義是指字元組成的陣列, ... #include #include int main(void) { char text[] = "hello"; ... 回C語言目錄 字串就是一串文字,在C談到字串的話,一個意義是指字元組成的陣列,最後加上一個空(null)字元'\0',例如底下是個"hello"字串: chartext[]={'h','e','l','l','o','\0'}; 之後可以直接使用text來代表"hello"文字,例如: printf("%s\n",text); 也可以使用“”來包含文字,例如: chartext[]="hello"; "hello"是字串字面常量,在這個例子中,雖然沒有指定空字元'\0',但是會自動加上空字元,來看看底下這個程式就可以得知: #include #include intmain(void){ chartext[]="hello"; intlength=sizeof(text)/sizeof(text[0]); for(inti=0;i #include intmain(void){ wchar_ttext[]=L"良葛格"; printf("字串長度%d",wcslen(text));//顯示3 return0; } L"良葛格"這種寫法,稱為擴充字元字串(wide-chararaterstring),C的字串處理函式,都有對應wchar_t的版本,只要將函式名稱的str前置改為wcs前置就可以了,wcs就是wide-chararaterstring的縮寫。

wchar_t並沒有規定大小,只要求必須容納系統中可以使用的字元,C11在uchar.h中定義了char16_t與char32_t,這會讓人誤以為它們用來儲存編碼,其實它們依舊是儲存碼點。

char16_t可儲存的碼點,必須能涵蓋UTF-16編碼可表現的全部字元,使用的字元常量或字串常量前要加上u,例如: char16_tch=u'林'; char16_ttext[]=u"良葛格"; char32_t可儲存的碼點,必須能涵蓋UTF-32編碼可表現的全部字元,使用的字元常量或字串常量前要加上U,例如: char32_tch=U'林'; char32_ttext[]=U"良葛格"; 至於char之間與wchar_t、char16_t、char32_t間要怎麼轉換呢?這問題基本上涉及Unicode碼點要轉換至哪個編碼,若是Unicode碼點與UTF-8的轉換,可以參考底下的實作(修改自C++UTF-8codepointconversion): #include #include voidtoUTF8(intcp,char*str); inttoCodePoint(char*str,intlen); intmain(void){ charstr1[5]={0x00}; toUTF8(L'林',str1); printf("%s\n",str1);//在UTF-8終端機下會顯示「林」 charstr2[]=u8"林";//「林」會使用三個位元組 printf("%d\n",toCodePoint(str2,3));//顯示26519 return0; } voidtoUTF8(intcp,char*str){ if(cp<=0x7F){ str[0]=cp; } elseif(cp<=0x7FF){ str[0]=(cp>>6)+192; str[1]=(cp&63)+128; } elseif(0xd800<=cp&&cp<=0xdfff){}//無效區塊 elseif(cp<=0xFFFF){ str[0]=(cp>>12)+224; str[1]=((cp>>6)&63)+128; str[2]=(cp&63)+128; } elseif(cp<=0x10FFFF){ str[0]=(cp>>18)+240; str[1]=((cp>>12)&63)+128; str[2]=((cp>>6)&63)+128; str[3]=(cp&63)+128; } } inttoCodePoint(char*u,intlen){ if(len<1){ return-1; } unsignedcharu0=u[0]; if(u0>=0&&u0<=127){ returnu0; } if(len<2){ return-1; } unsignedcharu1=u[1]; if(u0>=192&&u0<=223){ return(u0-192)*64+(u1-128); } if(u[0]==0xed&&(u[1]&0xa0)==0xa0){ return-1;//codepoints,0xd800to0xdfff } if(len<3){ return-1; } unsignedcharu2=u[2]; if(u0>=224&&u0<=239){ return(u0-224)*4096+(u1-128)*64+(u2-128); } if(len<4){ return-1; } unsignedcharu3=u[3]; if(u0>=240&&u0<=247){ return(u0-240)*262144+(u1-128)*4096+(u2-128)*64+(u3-128); } return-1; }



請為這篇文章評分?