作者doomleika (丁丁是个人才)
看板C_and_CPP
标题Re: [问题] if的问题
时间Thu Apr 5 18:27:54 2007
※ 引述《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)
1F:推 jaw109:有够详细,给你个推 XD 04/05 18:55
2F:→ slalala:p指向某变数「f」内容数字的记忆体位置!? 04/05 19:14
3F:→ shimii:写的好详细 完全董了:) 谢谢 04/05 19:18
4F:→ shimii:p才是变数@@ 讲颠倒了 04/05 19:19
5F:推 slalala:P不是变数 *p指标吧?! f才变数?! 这段连结原po写在函式?! 04/05 19:28
6F:→ 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)
7F:推 doomleika:这样讲可能不容易理解,想要live与程式记忆体SNG 04/05 20:05
8F:→ doomleika:请开你的debugger(除错器)捡查 04/05 20:06
9F:推 slalala:对嘛~所以我会以为这段程式码在函式里面~ 04/05 20:14
10F:→ slalala:简单说就是把f='X'的f的记忆体位置复制给p 04/05 20:15
11F:→ doomleika:no, 原po的那个意思我想是把ASCII码当成记忆体存进去 04/05 20:22
12F:推 slalala:所以方法几乎错了?? 指标有时候很难懂/ \ 04/05 20:23
13F:推 shimii:所以关键是那个&就是了@@ 又上了一课!谢拉~XD 04/05 20:25
14F:推 slalala:建议先知道&的意思喔 04/05 20:29
15F:→ PsMonkey:推内容也顺便推签名档 04/05 21:49
16F:推 compound:推一下~ :) 04/06 16:32