C_and_CPP 板


LINE

各位前辈好,小弟是程式新手,目前遇到了点困难 我打算用C++撰写一个加密法 我的想法是这样 string ANS;//建立一个字串阵列ANS储存输入的明文 string password;//建立一个字串password用来储存最後的密文 char word[99] = { 'a','b','c','d','e','f','g' ,'h','i','j','k','l','m','n','o' ,'p','q','r','s','t','u','v' ,'w','x','y','z' }; //建立一个字元阵列word,里面包含26个英文字母,每个字母对应一个栏位 (设99是因为不知道为什麽,给程式自动判断长度会输出乱码,[26]也是一样的结果) int key=2;//建立金钥key=2,代表要将输入明文字母往後推算2个字母 cout << "请输入明文:" << "\n"; cin >> ANS; for (int howlong = 0; howlong<ANS.size(); howlong++) { for (int i = 0; ANS[howlong] != word[i]; i++) { if (ANS[howlong] = word[i]) { password[howlong] = word[i + key]; } } } 做两次的for回圈,第一次是判断这个明文有多长,并且用一个howlong来判断现在是ANS 的第几个栏位 第二次的回圈是判断现在的ANS栏位是否等於word中的任一字母 最後如果ANS[howlong]的字母=word[i]的字母,就将word的栏位後推key=2个,并将内容丢 到password的栏位中 cout << "\n" << "明文:" << ANS << "\n" << "\n"; cout << "密文:" << password << "\n" << "\n"; cout << "金钥:" << key << "\n" << "\n"; system("pause"); return 0; 但是最後我做输出时,password仍然是空的,请问我哪里做错了? 感谢 ------------------------------------------------------------------------------ 感谢版上各位的帮助 我做出来了 做出来的程式已经大大超过老师的需求 真正实作後才发现有很多观念上的错误,也学到了很多 最後再请教几个小小的问题,请问能够将string阵列中的内容一次输出吗? 因为我现在是一个字一个字做输出(cout<<password[0] << password[1]....) 这样key感觉满烦的 以及 为何用char输出password字串会变成乱码? 我已经给了足够的大小,用string就不会有这个问题 我直接cout<<word,确实能直接把字母依序列出 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.184.18.42
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1489310892.A.19C.html
1F:推 ilikekotomi: if (ANS[howlong] = word[i]) 改成==试试看 03/12 17:36
刚刚试了,password仍然是空的 ※ 编辑: d630200x (111.184.18.42), 03/12/2017 17:38:47
2F:→ ilikekotomi: ANS[howlong] != word[i] 主要问题出在这边 03/12 17:54
3F:→ ilikekotomi: 然後要改成password += word[i + key]; 03/12 17:55
4F:→ ilikekotomi: for会先检查ANS[howlong] != word[i] 03/12 17:56
5F:→ ilikekotomi: 所以当ANS[howlong] == word[i]的情况就会跳出for 03/12 17:56
6F:→ ilikekotomi: 最後结果就必成password是空的 03/12 17:56
7F:→ ilikekotomi: 然後ANS有y和z的话应该会有问题 要想办法解决 03/12 17:58
所以是代表我的程式从头到尾都没有跳进if里面吗? 这边的观念我不太清楚,回圈不是会做动作直到达到条件吗? 我给予的条件是如果howlong不等於i,i就会+到等於howlong,然後如果两者相等,就输 出至password,为什麽程式反而会先跳出回圈?
8F:→ TobyH4cker: password大小不够 明文yz没处理 处理word不设size会无 03/12 18:01
9F:→ TobyH4cker: 穷回圈 你需要多练基本功 甚至你先全部用阵列做 把观 03/12 18:01
10F:→ TobyH4cker: 念弄清楚 03/12 18:01
我这边没注意到,我在想办法解决,我自己本身是想要把一段冗长的判断工作交给电脑, 试试看我自己想的这种写法而已 ※ 编辑: d630200x (111.184.18.42), 03/12/2017 18:17:57
11F:推 LPH66: 开头的乱码的原因是你的 word 是字元阵列不是字串 03/12 18:27
12F:→ LPH66: 因此你不能对它使用字串的函数 03/12 18:28
13F:→ LPH66: 这包含直接 cout 也算, 你必须一个字元一个字元 cout 03/12 18:28
14F:→ LPH66: 回圈动作是「条件成立时继续」喔, 比较一下你的外层回圈 03/12 18:30
15F:→ LPH66: howlong < ANS.size() 在回圈中是「成立」的 03/12 18:30
16F:推 ilikekotomi: 如果你ANS是"aaa"的话 因为ANS[0]==word[0] 03/12 19:41
17F:→ ilikekotomi: 就跳出回圈了 03/12 19:42
18F:→ ilikekotomi: 所以if没遇到相等的机会 03/12 19:43
19F:推 ilikekotomi: 不晓得您的环境是什麽 不然使用debugger可以 03/12 19:49
20F:→ ilikekotomi: 一步一步执行 这样可以很清楚看出哪里有问题 03/12 19:49
21F:推 Killercat: 是时候该跟debugger约个会了,学一下step吧 XD 03/13 10:23
22F:→ Killercat: 另外自动判断长度是乱码是因为没有\0 03/13 10:23
23F:→ Killercat: char*系列的字串都是以结尾为\0为假设 请务必注意 03/13 10:24
24F:→ LPH66: 但是他这里的用途就不是当做字串用... 03/13 12:51
25F:→ LPH66: 同样是 char[], 到底是字元阵列还是字串是用的人要注意 03/13 12:51
※ 编辑: d630200x (111.184.18.42), 03/13/2017 19:17:01 ※ 编辑: d630200x (111.184.18.42), 03/13/2017 19:17:32 ※ 编辑: d630200x (111.184.18.42), 03/13/2017 19:21:57 ※ 编辑: d630200x (111.184.18.42), 03/13/2017 19:24:45
26F:推 LPH66: string 可以直接 cout 没有问题 03/13 19:43
27F:→ LPH66: 但如果你的建立方式是跟这篇上面的程式码一样的话会有问题 03/13 19:43
28F:→ LPH66: 问题在於 string 你要嘛请他自己黏进去 (用 + 就可以了) 03/13 19:44
29F:→ LPH66: 要嘛你先请他开一个空间 (.resize) 再用 [] 填字进去 03/13 19:44
30F:→ LPH66: 不能什麽空间都不开就填字 03/13 19:45
31F:→ LPH66: 以你是新手的话那就用 + 把字黏进字串里就行了 03/13 19:45
32F:→ LPH66: 大概像是 password = password + word[i + key]; 这样 03/13 19:46
33F:→ LPH66: 乱码的底层原因是上面 Killercat 讲的那样 03/13 19:46
34F:→ LPH66: 但根本原因还是你在这里误用到了「C 字串」的处理函式 03/13 19:47
35F:→ LPH66: 关於 C 字串你暂时不需要知道 (你已经有 string 了) 03/13 19:48
36F:→ LPH66: 只要知道一个字元阵列很多时候会被当成 C 字串 03/13 19:48
37F:→ LPH66: 但你这里并不是当做 C 字串来使用的, 所以不能使用它 03/13 19:49
38F:→ LPH66: 这部份要在这里讲要不少东西, 你可以去问你的老师 03/13 19:50
好的,感谢解答 ※ 编辑: d630200x (111.184.18.42), 03/13/2017 19:56:27
39F:推 Killercat: 推LPH 的确现在是很多人建议就直接遗忘掉char*用string 03/15 14:18
40F:→ Killercat: C-style string(就是上面的char*)放入历史吧 03/15 14:19
41F:推 TobyH4cker: 怎麽可以,这不是很重要吗 03/15 23:40
42F:→ TobyH4cker: 一堆人用错因为没学好 还有人const * char强转char * 03/15 23:50
43F:推 BlazarArc: const * char ? 03/16 17:25







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灯, 水草

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

TOP