Character String

字元、字串

單獨一個ASCII碼稱為字元,例如:英文字母、數字、鍵盤上的符號等,單一中文字不是字元。

兩個以上字元組成的則稱為字串,中文字如果是以Big-5碼存放,則佔2位元組、以UTF-8碼存放,則佔3位元組。

標頭檔: include <cstring>

處理字串之前C++必須先引用標頭檔cstring

C語言是引用: include <string.h>

語法:char 變數名稱[];

字元:char ch='A';

字串:char text[]="She is a student."

或 char text[]={'S','h','e',' ','i','s',' ','a',' ','s','t','u','d','ent."}

※字元給值用單引號、字串給值用雙引號。

※字串就是字元陣列※


字元遇到中文字

•宣告一個字元:

•char name=‘張’;

•printf (“%c\n”,name);

•編譯結果會如何?印的出‘張’這個中文字嗎?

•char text[] = {‘張’,’庭’,’禎’,’\0’};

•printf (“%s\n”,text); 或 cout << text << endl;

•編譯結果會如何?印的出‘張庭禎’這個姓名嗎?

觀察:

Dev C++編譯時出現警告:

[Warning] multi-character character constant [-Wmultichar]

[Warning] overflow in implicit constant conversion [-Woverflow]

無法正確顯示出姓名。


試試看

•char name='張';

•char name[]='張';

•static char name='張';

•static char name[]="張";

上面這四種宣告方式,哪一種可以使用以下指令正常編譯並輸出?

cout << name << endl;

※英文字元以單引號指定、中文是兩個以上的字元所組成,因此要用雙引號。※

練習:宣告一個字串變數,存放你的中文姓名,並將它輸出到螢幕上。


※含中文字的字串,使用 char name[] = "中文",來宣告。


※ \0的妙用...

有一串字串,如果只想印出前段文字,這時候就可以利用偵測\0來中止列印。

例如:Jack is a student.,只想印出Jack,則字串內容可以這麼放:

char student[] = "Jack \0 is a student."

然後輸出的程式使用迴圈來寫:

for(int i=0 ; student[i] != '\0' ; i=i+1 )

cout << student[i];

※注意變數i要從0開始,即:字串的陣列存取是由0開始。※

如果\0不是放中間,而是放在字串最後面,那就會全部印出來。

思考:不用迴圈,直接以 cout << student << endl;列印時,效果會一樣嗎?

思考:char student[] = "Jack is a student."並未在最後面放入\0,直接使用上列方法輸出,效果會如何呢?


密碼學裡有一種簡單的加密方式,就是把明碼的每個字元加上某一個整數K而得到密碼字元(明碼及密碼字元一定都在ASCII碼中可列印的範圍內)。例如:如果K=2,則apple經過加密後就變成了crrng。解密則是反過來做。

※請注意:ASCII可列印字元範圍 0x20 -- 0x7F 。

int ResChar;

char str[];

加密方法:明碼+K值

ResChar = str[i] + K;

str[i] = (char)ResChar; //在迴圈內執行

問題:寫一支程式,輸入20字元(含空白,請參考輸入-不濾掉空白),輸出加密結果。

提示:使用 cin.get(字串變數,20);

解密方法:密碼 - K值,

ResChar = str[i] - K;

str[i] = (char)ResChar; //在迴圈內執行

問題:請你將底下的加密字串複製,當成你程式的輸入字串,看看輸出明碼為何?

輸入:1PIT'pz'h'{yhklthyr'vm'{ol'Pu{lyuh{pvuhs'I|zpulzz'Thjopul'Jvywvyh{pvu5


提示:k=7

*IBM is a trademark of the International Business Machine Corporation.

字元及字串的輸入

欲輸入一n個字元的字串

char ch[n];

scanf("%s",&ch);

字串初始化

char txt[]="abcdefghijklmnopqrstuvwxyz";

字串連接 strcat(str1,str2)

※將後面字串加入到前面字串後面。必須引入標頭檔string.h。

※超出目的字串str1長度時可能出現錯誤。

#include<string.h>

char str1[]="123";

char str2[]="456";

printf("%s",strcat(str1,str2)); //輸出123456

※這時str1的內容就會變成 123456。

字串連接 strncat(str1,str2)

※將後面字串加入到前面字串後面,如果超過str1長度時,超出部分可能會捨去(實際執行時會不斷加到字串後面)。

char str1[10]="0123456";

char str2[]="789ABCDE";

strncat(str1,str2,6);

str1內容變成 "0123456789ABC"。

strncat(str1,str2,8);

str1內容變成 "0123456789ABCDE"。

※strncat必須指定要接過去的長度。


字串長度strlen(str1)

char str1[]="ABCDE";

printf("%11d",strlen(str1)); //輸出5

字串比較 strcmp(str1,str2)