Character and String

By Sean Chiu, 2017 summer

Character     字元

什麼是字元?

單引號 ' '包住的一個字母/數字/符號,就是字元
像是 'A' 'a' '0' '@' '!' 都是字元

宣告方式

char a; char b='A';

使用方式

char a; cin>>a; cout<<a;


字元與數值

ASCII

十進位 代表字元 十進位 代表字元
48 0 49 1
50 2 51 3
52 4 53 5
54 6 55 7
56 8 57 9
65 A 97 a
66 B 98 b
67 C 99 c
68 D 100 d
69 E 101 e
70 F 102 f
71 G 103 g
72 H 104 h
73 I 105 i
74 J 106 j
75 K 107 k
76 L 108 l
77 M 109 m
78 N 110 n
79 O 111 o
80 P 112 p
81 Q 113 q
82 R 114 r
83 S 115 s
84 T 116 t
85 U 117 u
86 V 118 v
87 W 119 w
88 X 120 x
89 Y 121 y
90 Z 122 z

我們甚至可以直接以數字取代字元( 97取代 'a'

字元與數值間的轉換

利用強制轉型,在 intchar間互相轉換

將字元轉成對應整數: (int)字元變數
將整數轉成對應字元: (char)整數變數

char a='A'; int b=65; cout<<(int)a<<" / "; cout<<(char)b<<endl;
    > 輸出:A / 65

練習 [整數->字元轉換]

讓使用者輸入一個介於33~126間的整數,印出相對應的字元

練習 [字元->整數轉換]

讓使用者輸入一個字元,印出相對應的整數


字元間的距離

直接把兩個字元來相減,就可以得到距離

cout<<'b'-'a';
    > 輸出:1

我們可以利用這個性質,將字元的數字轉成真正的數字

char c='7'; int a=c-0; int b=c-'0'; cout<<"'7' - 0 = "<<a; cout<<"'7' - '0' = "<<b;
    > 輸出: '7' - 0 = 55
    >       '7' - '0' = 7


C語言跳脫字元(\)

跳脫字元 指的是 脫離原字元的意思
利用跳脫字元可以達成跟原本字元不一樣的動作

字元 代表意義 字元 代表意義
\n 換行(與endl相同) \t Tab(多行對齊)
\a 嗶聲 \\ \
\’ \" "
\0 空字元(沒東西)


儲存字元的陣列

char a[10000];


輸入方面,可以用 cin個別讀取字元或直接讀取整個字串
也可以用 scanf("%s",&陣列名稱) (執行速度較快)

輸入整串字串時, cinscanf會在最後一個字的下一格放一個 /0

若使用scanf,此時標頭要加上 #include<stdio.h>

#include<iostream> #include<stdio.h> using namespace std; char a[100]; int main(){ scanf("%s",&a1) }


輸出方面,以 cout達成, cout會逐格輸出直到碰到 /0為止


範例-輸入名字

名字是由大小寫英文組成。
請依序輸出使用者輸入的字元直到不是大小寫英文為止。

#include<iostream> using namespace std; int main(){ char name[1000001]; int i=0; while(1){ cin>>name[i]; char c=name[i]; if(c!='a'&&c!='b'&&c!='c'&&c!='d'&&c!='e'&&c!='f'&&c!='g'&&c!='h'&&c!='i'&&c!='j'&&c!='k'&&c!='l'&&c!='m'&&c!='n'&&c!='o'&&c!='p'&&c!='q'&&c!='r'&&c!='s'&&c!='t'&&c!='u'&&c!='v'&&c!='w'&&c!='x'&&c!='y'&&c!='z'&&c!='A'&&c!='B'&&c!='C'&&c!='D'&&c!='E'&&c!='F'&&c!='G'&&c!='H'&&c!='I'&&c!='J'&&c!='K'&&c!='L'&&c!='M'&&c!='N'&&c!='O'&&c!='P'&&c!='Q'&&c!='R'&&c!='S'&&c!='T'&&c!='U'&&c!='V'&&c!='W'&&c!='X'&&c!='Y'&&c!='Z')break; i=i+1; } cout<<"Hello, "; int j=0; for(int j=0;j<i;j++){ cout<<name[j]; } cout<<"!"<<endl; return 0; }


輸入名字 (改良版)

#include<iostream> using namespace std; int main(){ char name[1000001]; int i=0; while(1){ cin>>name[i]; if(!((97<=name[i]&&name[i]<=122)||(65<=name[i]&&name[i]<=90))) break; i=i+1; } cout<<"Hello, "; int j=0; for(int j=0;j<i;j++){ cout<<name[j]; } cout<<"!"<<endl; return 0; }

或是

#include<iostream> using namespace std; int main(){ char name[1000001]; int i=0; while(1){ cin>>name[i]; if(!(('a'<=name[i]&&name[i]<='z')||('A'<=name[i]&&name[i]<='Z'))) break; i=i+1; } cout<<"Hello, "; int j=0; for(int j=0;j<i;j++){ cout<<name[j]; } cout<<"!"<<endl; return 0; }


練習 [@結尾]

讓使用者輸入一串字元,並以@結尾(不超過50個)
並輸出那些字元
也就是說,輸出到@字元時,結束輸出(不輸出@)。

input: Hi,APCS@gmail
output: Hi,APCS

參考答案



string     字串

什麼是字串?

簡單來說就是 上面提到的 儲存字元的陣列
雙引號 " "包住的一串字母/數字/符號,就是字串
像是 "Hello, world!" "APCS" "2017/7/21" "天氣晴" 都是字串

宣告方式

string a; string b="hello, world";

使用方式

string name; cin>>string; cout<<string;


存取某個字

因為 字串 就是 字元陣列,所以我們可以用陣列的語法來取得字串中任意位置的字

string a="apcs"; cout<<a[3]<<" "<<a[2]<<" "<<a[1]<<" "<<a[0];

執行結果: s c p a


取得字串長度

c++ 提供了函式,讓我們可以快速取得字串的長度

字串長度: 字串變數名稱.length()

string a="apcs"; cout<<a.length();

執行結果: 4


練習 [字串與長度]

讓使用者輸入一個字串
然後倒序輸出

input: APCS
output: SCPA

參考答案

試試看,如果輸入一個包含空白的字串,答案會變怎樣?


空白字元輸入

若大家用 cin 的方法輸入,當輸入空白字元時,電腦會判定輸入結束,所以空白後的字都不會被存進字串。

使用 cin 讀入字串時要特別注意空格的處理

這時我們可以用讀入整行的方法完成輸入。

讀入整行包含空白的字串:    getline(cin,字串變數)

string a; getline(cin,a);


string 的好用函式

以下用法只適用於型態是 string的變數

字串串接: 字串1=字串2+字串3;

string a,b,c; cin>>a>>b c=a+b; cout<<c;

取出 來源字串 某段給 存放字串:
存放字串.assign(來源字串,從哪個字元開始,取幾個字元)

string a,b; cin>>a; b.assign(a,1,3); cout<<b;
    > 輸入:apcs
    > 輸出:pcs

取出 來源字串 某段加到 存放字串 後面:
存放字串.append(來源字串,從哪個字元開始,取幾個字元)

string a,b="@gmail.com"; cin>>a; a.append(b,0,b.length()); cout<<a;
    > 輸入:apcs
    > 輸出:apcs@gmail.com

從字串x的第 n 格開始搜尋某字串y,回傳開頭位置:
x.find(y,n)

string a="@gmail.com"; cout<<a.find(".com",3);
    > 輸出:6

從字串x的第 n 格開始 插入某字串y:
x.insert(n,y)

string a="@.com"; a.insert(1,"gmail"); cout<<a;
    > 輸出:@gmail.com


char[ ] 的好用函式

以下用法只適用於型態是 char[]的變數

以下請都要記得加入 #include<string.h>才能使用

字串長度(從頭到不是 \0的長度): strlen(陣列);

char a[100]; cin>>a; int len = strlen(a); cout<<len;
    >輸入:apcs
    >輸出:4

字典順序: strcmp(陣列1,陣列2)


若 陣列1比陣列2 字典順序較前,回傳 -1
若 陣列1和陣列2 相同,回傳 0
若 陣列1比陣列2 字典順序較後,回傳 1

char s1[100],s2[100]; cin>>s1>>s2; if( strcmp( s1, s2 ) == -1 ) cout << "順序正確" << endl; if( strcmp( s1, s2 ) == 0 ) cout << "兩字完全相同" << endl; if( strcmp( s1, s2 ) == 1 ) cout << "順序相反" << endl;
    >輸入:rock roll
    >     roll rock
    >     rock rock
    >     
    >輸出:順序正確
    >     順序相反
    >     兩字完全相同