作者d630200x (DOGE)
看板C_and_CPP
標題[問題] 用C++撰寫加密法[已解決&小問題]
時間Sun Mar 12 17:28:08 2017
各位前輩好,小弟是程式新手,目前遇到了點困難
我打算用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