[問題] 用C++撰寫加密法

看板C_and_CPP作者 (DOGE)時間8年前 (2017/03/12 17:28), 8年前編輯推噓9(9034)
留言43則, 5人參與, 最新討論串1/1
各位前輩好,小弟是程式新手,目前遇到了點困難 我打算用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://www.ptt.cc/bbs/C_and_CPP/M.1489310892.A.19C.html

03/12 17:36, , 1F
if (ANS[howlong] = word[i]) 改成==試試看
03/12 17:36, 1F
剛剛試了,password仍然是空的 ※ 編輯: d630200x (111.184.18.42), 03/12/2017 17:38:47

03/12 17:54, , 2F
ANS[howlong] != word[i] 主要問題出在這邊
03/12 17:54, 2F

03/12 17:55, , 3F
然後要改成password += word[i + key];
03/12 17:55, 3F

03/12 17:56, , 4F
for會先檢查ANS[howlong] != word[i]
03/12 17:56, 4F

03/12 17:56, , 5F
所以當ANS[howlong] == word[i]的情況就會跳出for
03/12 17:56, 5F

03/12 17:56, , 6F
最後結果就必成password是空的
03/12 17:56, 6F

03/12 17:58, , 7F
然後ANS有y和z的話應該會有問題 要想辦法解決
03/12 17:58, 7F
所以是代表我的程式從頭到尾都沒有跳進if裡面嗎? 這邊的觀念我不太清楚,迴圈不是會做動作直到達到條件嗎? 我給予的條件是如果howlong不等於i,i就會+到等於howlong,然後如果兩者相等,就輸 出至password,為什麼程式反而會先跳出迴圈?

03/12 18:01, , 8F
password大小不夠 明文yz沒處理 處理word不設size會無
03/12 18:01, 8F

03/12 18:01, , 9F
窮迴圈 你需要多練基本功 甚至你先全部用陣列做 把觀
03/12 18:01, 9F

03/12 18:01, , 10F
念弄清楚
03/12 18:01, 10F
我這邊沒注意到,我在想辦法解決,我自己本身是想要把一段冗長的判斷工作交給電腦, 試試看我自己想的這種寫法而已 ※ 編輯: d630200x (111.184.18.42), 03/12/2017 18:17:57

03/12 18:27, , 11F
開頭的亂碼的原因是你的 word 是字元陣列不是字串
03/12 18:27, 11F

03/12 18:28, , 12F
因此你不能對它使用字串的函數
03/12 18:28, 12F

03/12 18:28, , 13F
這包含直接 cout 也算, 你必須一個字元一個字元 cout
03/12 18:28, 13F

03/12 18:30, , 14F
迴圈動作是「條件成立時繼續」喔, 比較一下你的外層迴圈
03/12 18:30, 14F

03/12 18:30, , 15F
howlong < ANS.size() 在迴圈中是「成立」的
03/12 18:30, 15F

03/12 19:41, , 16F
如果你ANS是"aaa"的話 因為ANS[0]==word[0]
03/12 19:41, 16F

03/12 19:42, , 17F
就跳出迴圈了
03/12 19:42, 17F

03/12 19:43, , 18F
所以if沒遇到相等的機會
03/12 19:43, 18F

03/12 19:49, , 19F
不曉得您的環境是什麼 不然使用debugger可以
03/12 19:49, 19F

03/12 19:49, , 20F
一步一步執行 這樣可以很清楚看出哪裡有問題
03/12 19:49, 20F

03/13 10:23, , 21F
是時候該跟debugger約個會了,學一下step吧 XD
03/13 10:23, 21F

03/13 10:23, , 22F
另外自動判斷長度是亂碼是因為沒有\0
03/13 10:23, 22F

03/13 10:24, , 23F
char*系列的字串都是以結尾為\0為假設 請務必注意
03/13 10:24, 23F

03/13 12:51, , 24F
但是他這裡的用途就不是當做字串用...
03/13 12:51, 24F

03/13 12:51, , 25F
同樣是 char[], 到底是字元陣列還是字串是用的人要注意
03/13 12:51, 25F
※ 編輯: 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

03/13 19:43, , 26F
string 可以直接 cout 沒有問題
03/13 19:43, 26F

03/13 19:43, , 27F
但如果你的建立方式是跟這篇上面的程式碼一樣的話會有問題
03/13 19:43, 27F

03/13 19:44, , 28F
問題在於 string 你要嘛請他自己黏進去 (用 + 就可以了)
03/13 19:44, 28F

03/13 19:44, , 29F
要嘛你先請他開一個空間 (.resize) 再用 [] 填字進去
03/13 19:44, 29F

03/13 19:45, , 30F
不能什麼空間都不開就填字
03/13 19:45, 30F

03/13 19:45, , 31F
以你是新手的話那就用 + 把字黏進字串裡就行了
03/13 19:45, 31F

03/13 19:46, , 32F
大概像是 password = password + word[i + key]; 這樣
03/13 19:46, 32F

03/13 19:46, , 33F
亂碼的底層原因是上面 Killercat 講的那樣
03/13 19:46, 33F

03/13 19:47, , 34F
但根本原因還是你在這裡誤用到了「C 字串」的處理函式
03/13 19:47, 34F

03/13 19:48, , 35F
關於 C 字串你暫時不需要知道 (你已經有 string 了)
03/13 19:48, 35F

03/13 19:48, , 36F
只要知道一個字元陣列很多時候會被當成 C 字串
03/13 19:48, 36F

03/13 19:49, , 37F
但你這裡並不是當做 C 字串來使用的, 所以不能使用它
03/13 19:49, 37F

03/13 19:50, , 38F
這部份要在這裡講要不少東西, 你可以去問你的老師
03/13 19:50, 38F
好的,感謝解答 ※ 編輯: d630200x (111.184.18.42), 03/13/2017 19:56:27

03/15 14:18, , 39F
推LPH 的確現在是很多人建議就直接遺忘掉char*用string
03/15 14:18, 39F

03/15 14:19, , 40F
C-style string(就是上面的char*)放入歷史吧
03/15 14:19, 40F

03/15 23:40, , 41F
怎麼可以,這不是很重要嗎
03/15 23:40, 41F

03/15 23:50, , 42F
一堆人用錯因為沒學好 還有人const * char強轉char *
03/15 23:50, 42F

03/16 17:25, , 43F
const * char ?
03/16 17:25, 43F
文章代碼(AID): #1OnHIi6S (C_and_CPP)