[爆卦]ASCII 碼 aZ是什麼?優點缺點精華區懶人包

為什麼這篇ASCII 碼 aZ鄉民發文收入到精華區:因為在ASCII 碼 aZ這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者doomleika (丁丁是個人才)看板C_and_CPP標題Re: [問題] if的問題時間T...


※ 引述《shimii (溶化了)》之銘言:
: 我想要 if(*p=='a-z'||*p=='A-Z')
: 也就是說只要*p=a-z或是A-Z就會繼續下去做
: 可是我要編譯的時候他卻不給我過
NO,你不可以這樣寫,這是C/C++本身的限制,他語法沒有提供你指定一範圍內的
ASCII Code。

而單引號內也只能擺「一個」字元,像是:
'a' 指小寫a的ASCII碼
'A' 指大寫A的ASCII碼
'8' 指數字8的ASCII碼
',' 這是浮號「,」的ASCII碼
' ' 這是空白字元的ASCII碼。

但你不能寫'a-z'這種寫法。想要比對一個範圍內的ASCII字元,你需要這精美的ASCII碼表
(通常計概書或程設書也會附)

http://en.wikipedia.org/wiki/ASCII

像是你比對「e」ASCII碼我們查到是101,那你能這樣寫(假設你要與一char變數ch比對)

if(ch == 101)
或是
if(ch == 'e')

第一個寫法其實作了些轉換,在C/C++中直接寫數字編譯器會預設為int,而你與一char變
數比較,ch會被往上轉成int型態再作比較,不過這是細節就是。個人推薦第二種寫法,比
較好讀。

如果你想比對一個範圍內的字元,比如說,bcd三個ASCII,b == 98, d == 100,那你可以
這樣寫
if(ch >= 98 && ch <= 100)

或是

if(ch >= 'b' && ch <= 'd')

而像你原題的要求。那會是
if((ch >= 97 && ch <= 122) || (ch >= 65 && ch <= 90))

更易讀的寫法
if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <='Z'))

注意在ASCII中,小寫字母的ASCII碼要比大寫字母要「大」

以上是自己寫的作法,C的標準函式庫中有提供一系列撿查ASCII字元的函式
(ctype.h)

: 請問要怎麼改才對呢?
: 還有我想用if比對出特殊字元要怎麼寫?
: 例如問號.逗號.之類的符號
: (空白也算)特殊字元很多..難道要一個一個打嗎= ="?
: 有沒有什麼方法....教一下 謝謝(躬
如果你要比對一組ASCII字碼不相鄰的字碼,真的就只能用一個一個打了(爆)

不過有簡化的作法,比如說自定資料結構與一組函式把你要比對的字元塞進資料
結構中,再用你自己寫的函式去簡查。

如果你有用C++,標準函式庫有提供Set(集合),你可以把你要比對的字元塞進去,
再用其提供的撿查操作去撿查。

: 另外問一下
: 我想在程式中間忽然插一句*p=f;
: 可是他也不給我過
: 還是說一定要在一開始宣告的時候就直接把他指定進去?
: cher *p=f;
你這行的意思是把p指向某變數「f」內容數字的位置。

--


此人使用掉到馬桶的C++ Primer 4ed

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.209.189.4
※ 編輯: doomleika 來自: 210.209.189.4 (04/05 18:30)
jaw109:有夠詳細,給你個推 XD 04/05 18:55
slalala:p指向某變數「f」內容數字的記憶體位置!? 04/05 19:14
shimii:寫的好詳細 完全董了:) 謝謝 04/05 19:18
shimii:p才是變數@@ 講顛倒了 04/05 19:19
slalala:P不是變數 *p指標吧?! f才變數?! 這段連結原po寫在函式?! 04/05 19:28
shimii:我只知道*p是指標變數..要在一開始宣告 orz 04/05 19:37


char* p是一個指標,我們假設f是char。
程式片段如下

char f = 'X';
char* p = f;

還沒進入程式前:

名稱 型態 值 位置
f char 未初始 未初始
p char* 未初始 未初始

跑到char f = 'X'; //PS, 「0x」開頭的數字是指十六進位

名稱 型態 值 位置
f char 'X'(0x58) 0xA001 //位置可能每次不同
p char* 未初始 未初始

跑到char p = f;
//要說一下,通常到這邊是不會允許的,compiler應該會說
//"Can not convert char to char*"之類的訊息,這是好事,
//如果compiler讓你這樣作,在使用*p時會用到不屬於你程式
//的資料,通常會有「本程式發生錯誤即將關閉」,倒霉一點
//就是程式安靜的取用到不屬於他的資料,然後你會發現你的
//程式行為莫名奇妙,然後debug一兩個小時才發現你犯了個愚
//蠢的錯誤


名稱 型態 值 位置
f char 'X'(0x58) 0xA001
p char* 0x0058 0xA002 //位置每次都可能不同


正常的情況應該是這樣

char f = 'X';
char* p = &f; //注意那個&

還沒進入程式前:

名稱 型態 值 位置
f char 未初始 未初始
p char* 未初始 未初始

跑到char f = 'X'; //PS, 「0x」開頭的數字是指十六進位

名稱 型態 值 位置
f char 'X'(0x58) 0xA001 //位置可能每次不同
p char* 未初始 未初始

跑到char p = &f;

名稱 型態 值 位置
f char 'X'(0x58) 0xA001 //位置可能每次不同
p char* 0xA001 0xA002
^^^^^^^
※ 編輯: doomleika 來自: 210.209.189.4 (04/05 20:02)
doomleika:這樣講可能不容易理解,想要live與程式記憶體SNG 04/05 20:05
doomleika:請開你的debugger(除錯器)撿查 04/05 20:06
slalala:對嘛~所以我會以為這段程式碼在函式裡面~ 04/05 20:14
slalala:簡單說就是把f='X'的f的記憶體位置複製給p 04/05 20:15
doomleika:no, 原po的那個意思我想是把ASCII碼當成記憶體存進去 04/05 20:22
slalala:所以方法幾乎錯了?? 指標有時候很難懂/ \ 04/05 20:23
shimii:所以關鍵是那個&就是了@@ 又上了一課!謝拉~XD 04/05 20:25
slalala:建議先知道&的意思喔 04/05 20:29
PsMonkey:推內容也順便推簽名檔 04/05 21:49
compound:推一下~ :) 04/06 16:32

你可能也想看看

搜尋相關網站