C_and_CPP 板


LINE

※ 引述《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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP