作者LPH66 (运命のルーレット廻して)
看板C_and_CPP
标题Re: [问题] 回文
时间Fri Dec 9 07:53:10 2005
※ 引述《tsaiminghan (tsaiminghan)》之铭言:
: ※ 引述《japanboy (小朋友 bye(远目))》之铭言:
: : 下面是小弟写的一个判断回文的程式
: : 不过小弟对第二个while回圈有点疑问
: : 因为算出来的值还要减1才是对的
: 在windows下,VC 6++
: 我试了一下的确会吃到\0
: ex 输入abccba
: *cp1=a cp2=a
: *cp1=b cp2=b
: *cp1=c cp2=c
: *cp1=c cp2=c
: *cp1=b cp2=b
: *cp1=a cp2=a
: *cp1='\0' cp2='\0'
: 神奇的是最後的 cp1='\0' cp2='\0'
: cp1吃到的是字串的结尾'\0',而cp2吃到的是ss-1的位置
: 这位置一开始未gets(ss)时的值是-52,gets(ss)之後值就变成0
: 试了很多次每次数值都是这样变化,总之k会多一是因为吃到0
: 至於为什麽会这样,就有劳其他人回答,我不知道原因
果然 看到VC++ 6就猜到可能这个0是别的变数的0
自己试了一下之後发现正是如此
*cp2吃到的0是cp1的最高byte
因为VC++6在把区域变数放进stack时是用堆的方式指定
也就是说 原程式这样宣告:
: char ss[257];
: char *cp1, *cp2;
: int k,len;
在堆叠里是这样摆的:
← 4 byte →
├────┤
│ │以上就不是这里的区域变数了
├────┤
│ │len
├────┤
│ │k
├────┤
│ │cp2
├────┤
│ │cp1
├────┤
│ │ss[257]
├────┤
│ │往下都是ss 共260 bytes(VC预设alignment是4 byte)
├────┤
而VC++ 6 在变数未预设初值时会先把每个byte填上0xCC (以char看就是-52)
因此一开始记忆体是是这样: (记忆体位址以我的为例)
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0x0012FE60
CC CC CC CC (
len)
0x0012FE70
CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC (
k,
cp2,
cp1,
ss)
0x0012FE80
CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC (
ss)
gets(ss);之後: (设输入"abccba" 即61 62 63 63 62 61 00)
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0x0012FE60
CC CC CC CC (
len)
0x0012FE70
CC CC CC CC CC CC CC CC CC CC CC CC 61 62 63 63 (
k,
cp2,
cp1,
ss)
0x0012FE80
62 61 00 CC CC CC CC CC CC CC CC CC CC CC CC CC (
ss)
cp1=cp2=ss;之後
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0x0012FE60
CC CC CC CC (
len)
0x0012FE70
CC CC CC CC 7C FE 12 00 7C FE 12 00 61 62 63 63 (
k,
cp2,
cp1,
ss)
0x0012FE80
62 61 00 CC CC CC CC CC CC CC CC CC CC CC CC CC (
ss)
注意到了吗? ss-1的位置(0x0012FE7B 我用
亮淡蓝色标的那一格)
在这个时候被放入了00 但其实它是cp1的值0x0012FE7C的最高byte: 0x00
所以最後比到的是cp1这个变数的最高byte
VC6分隔线VC6分隔线VC6分隔线VC6分隔线VC6分隔线VC6分隔线VC6分隔线VC6分隔线VC6分
回到原PO的程式,
这个问题要改其实很简单,
第二个while改成这样:
while (
*cp1 && *cp1++ == *cp2--) k++;
我们先一步检查是不是到了字串尾巴了,
如果还没, 那*cp1不为0, &&左边为true, 继续比较右边;
如果到了, 那*cp1就是0, &&左边为false, 就跳出while.
记得把k--拿掉.
--
"Shan't say nothing if you don't say please," said Peeves in his annoying
sing-song voice. "All right -- please."
"NOTHING! Ha haaa! Told you I wouldn't say nothing if you didn't say please!
Ha ha! Haaaaaa!" And they heard the sound of Peeves whooshing away and
Filch cursing in rage.
---'Harry Potter and the Philisopher's Stone', P119
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.82
1F:推 tsaiminghan:大感谢,对於VC变数的排法上了一课 12/09 08:42
2F:推 japanboy:L大好强唷 因为小弟不是用VC 不过也上了一课 谢谢~ 12/09 13:50
3F:推 imprazaguy:强者,受小弟一拜 12/09 23:02
4F:推 UNARYvvv:猛啊.. 12/10 00:48