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