Re: [問題] if的問題

看板C_and_CPP (C/C++)作者 (丁丁是個人才)時間17年前 (2007/04/05 18:27), 編輯推噓8(808)
留言16則, 6人參與, 最新討論串1/1
※ 引述《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)

04/05 18:55, , 1F
有夠詳細,給你個推 XD
04/05 18:55, 1F

04/05 19:14, , 2F
p指向某變數「f」內容數字的記憶體位置!?
04/05 19:14, 2F

04/05 19:18, , 3F
寫的好詳細 完全董了:) 謝謝
04/05 19:18, 3F

04/05 19:19, , 4F
p才是變數@@ 講顛倒了
04/05 19:19, 4F

04/05 19:28, , 5F
P不是變數 *p指標吧?! f才變數?! 這段連結原po寫在函式?!
04/05 19:28, 5F

04/05 19:37, , 6F
我只知道*p是指標變數..要在一開始宣告 orz
04/05 19:37, 6F
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)

04/05 20:05, , 7F
這樣講可能不容易理解,想要live與程式記憶體SNG
04/05 20:05, 7F

04/05 20:06, , 8F
請開你的debugger(除錯器)撿查
04/05 20:06, 8F

04/05 20:14, , 9F
對嘛~所以我會以為這段程式碼在函式裡面~
04/05 20:14, 9F

04/05 20:15, , 10F
簡單說就是把f='X'的f的記憶體位置複製給p
04/05 20:15, 10F

04/05 20:22, , 11F
no, 原po的那個意思我想是把ASCII碼當成記憶體存進去
04/05 20:22, 11F

04/05 20:23, , 12F
所以方法幾乎錯了?? 指標有時候很難懂/ \
04/05 20:23, 12F

04/05 20:25, , 13F
所以關鍵是那個&就是了@@ 又上了一課!謝拉~XD
04/05 20:25, 13F

04/05 20:29, , 14F
建議先知道&的意思喔
04/05 20:29, 14F

04/05 21:49, , 15F
推內容也順便推簽名檔
04/05 21:49, 15F

04/06 16:32, , 16F
推一下~ :)
04/06 16:32, 16F
文章代碼(AID): #165Cyjod (C_and_CPP)
文章代碼(AID): #165Cyjod (C_and_CPP)