作者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
推 tsaiminghan:大感謝,對於VC變數的排法上了一課 12/09 08:42
推 japanboy:L大好強唷 因為小弟不是用VC 不過也上了一課 謝謝~ 12/09 13:50
推 imprazaguy:強者,受小弟一拜 12/09 23:02
推 UNARYvvv:猛啊.. 12/10 00:48