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/m.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燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP