看板 C_and_CPP 關於我們 聯絡資訊
各位前輩好,小弟是程式新手,目前遇到了點困難 我打算用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
ilikekotomi: if (ANS[howlong] = word[i]) 改成==試試看 03/12 17:36
剛剛試了,password仍然是空的 ※ 編輯: d630200x (111.184.18.42), 03/12/2017 17:38:47
ilikekotomi: ANS[howlong] != word[i] 主要問題出在這邊 03/12 17:54
ilikekotomi: 然後要改成password += word[i + key]; 03/12 17:55
ilikekotomi: for會先檢查ANS[howlong] != word[i] 03/12 17:56
ilikekotomi: 所以當ANS[howlong] == word[i]的情況就會跳出for 03/12 17:56
ilikekotomi: 最後結果就必成password是空的 03/12 17:56
ilikekotomi: 然後ANS有y和z的話應該會有問題 要想辦法解決 03/12 17:58
所以是代表我的程式從頭到尾都沒有跳進if裡面嗎? 這邊的觀念我不太清楚,迴圈不是會做動作直到達到條件嗎? 我給予的條件是如果howlong不等於i,i就會+到等於howlong,然後如果兩者相等,就輸 出至password,為什麼程式反而會先跳出迴圈?
TobyH4cker: password大小不夠 明文yz沒處理 處理word不設size會無 03/12 18:01
TobyH4cker: 窮迴圈 你需要多練基本功 甚至你先全部用陣列做 把觀 03/12 18:01
TobyH4cker: 念弄清楚 03/12 18:01
我這邊沒注意到,我在想辦法解決,我自己本身是想要把一段冗長的判斷工作交給電腦, 試試看我自己想的這種寫法而已 ※ 編輯: d630200x (111.184.18.42), 03/12/2017 18:17:57
LPH66: 開頭的亂碼的原因是你的 word 是字元陣列不是字串 03/12 18:27
LPH66: 因此你不能對它使用字串的函數 03/12 18:28
LPH66: 這包含直接 cout 也算, 你必須一個字元一個字元 cout 03/12 18:28
LPH66: 迴圈動作是「條件成立時繼續」喔, 比較一下你的外層迴圈 03/12 18:30
LPH66: howlong < ANS.size() 在迴圈中是「成立」的 03/12 18:30
ilikekotomi: 如果你ANS是"aaa"的話 因為ANS[0]==word[0] 03/12 19:41
ilikekotomi: 就跳出迴圈了 03/12 19:42
ilikekotomi: 所以if沒遇到相等的機會 03/12 19:43
ilikekotomi: 不曉得您的環境是什麼 不然使用debugger可以 03/12 19:49
ilikekotomi: 一步一步執行 這樣可以很清楚看出哪裡有問題 03/12 19:49
Killercat: 是時候該跟debugger約個會了,學一下step吧 XD 03/13 10:23
Killercat: 另外自動判斷長度是亂碼是因為沒有\0 03/13 10:23
Killercat: char*系列的字串都是以結尾為\0為假設 請務必注意 03/13 10:24
LPH66: 但是他這裡的用途就不是當做字串用... 03/13 12:51
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
LPH66: string 可以直接 cout 沒有問題 03/13 19:43
LPH66: 但如果你的建立方式是跟這篇上面的程式碼一樣的話會有問題 03/13 19:43
LPH66: 問題在於 string 你要嘛請他自己黏進去 (用 + 就可以了) 03/13 19:44
LPH66: 要嘛你先請他開一個空間 (.resize) 再用 [] 填字進去 03/13 19:44
LPH66: 不能什麼空間都不開就填字 03/13 19:45
LPH66: 以你是新手的話那就用 + 把字黏進字串裡就行了 03/13 19:45
LPH66: 大概像是 password = password + word[i + key]; 這樣 03/13 19:46
LPH66: 亂碼的底層原因是上面 Killercat 講的那樣 03/13 19:46
LPH66: 但根本原因還是你在這裡誤用到了「C 字串」的處理函式 03/13 19:47
LPH66: 關於 C 字串你暫時不需要知道 (你已經有 string 了) 03/13 19:48
LPH66: 只要知道一個字元陣列很多時候會被當成 C 字串 03/13 19:48
LPH66: 但你這裡並不是當做 C 字串來使用的, 所以不能使用它 03/13 19:49
LPH66: 這部份要在這裡講要不少東西, 你可以去問你的老師 03/13 19:50
好的,感謝解答 ※ 編輯: d630200x (111.184.18.42), 03/13/2017 19:56:27
Killercat: 推LPH 的確現在是很多人建議就直接遺忘掉char*用string 03/15 14:18
Killercat: C-style string(就是上面的char*)放入歷史吧 03/15 14:19
TobyH4cker: 怎麼可以,這不是很重要嗎 03/15 23:40
TobyH4cker: 一堆人用錯因為沒學好 還有人const * char強轉char * 03/15 23:50
BlazarArc: const * char ? 03/16 17:25