[問題] 一個新手printf問題

看板C_and_CPP作者 (黑田祐司)時間9年前 (2015/02/17 14:59), 9年前編輯推噓2(209)
留言11則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) DEV C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) string.h 問題(Question): 我正在作練習題 題目是這樣的 第二次世界大戰中,德軍的通訊編碼被美國破解,以致於機密被美國竊聽而慘敗。德軍的 編碼規則(假)如下:將訊息每個字母往後推兩位再傳出去,例如 A→C、B→D,而後面的 Y→A、Z→B,所有的訊息都是大寫字母。而收到訊息的則是將每個字母往前推兩位,例 如 C→A、D→B,而前面的 A→Y、B→Z。假設你是美軍的情報軍,要快速編碼及解碼德軍 的訊息,希望完成一個程式,第一個字元為 + 代表要編碼,第一個字元為 - 代表要解碼 ,程式執行如下(粉紅色為輸入、淺藍色為輸出): 目前輸出的時候雖然可以成功輸出可是卻會出現一堆奇怪的東西 餵入的資料(Input): +ABCD 預期的正確結果(Expected Output): CDEF 錯誤結果(Wrong Output): 拍照上傳了 http://imgur.com/jESJ9AW
程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <string.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main() { int i; char code[80]; gets(code); if(code[0]=='+') { for(i=1;i<=strlen(code);i++) { code[i]=code[i]+2; if(code[i]>'Z') code[i]=code[i]-26; } } if(code[0]=='-') { for(i=1;i<=strlen(code);i++) { code[i]=code[i]+2; if(code[i]<'A') code[i]=code[i]+26; } } printf("%s \n",code+1); } 補充說明(Supplement): 我是新手 用範例的程式碼就沒問題 不曉得問題出在哪 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.24.181.235 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1424156397.A.EBE.html

02/17 15:24, , 1F
你改到字串結束字元了 要改成i<strlen(code)
02/17 15:24, 1F
原來是這樣 謝謝 ※ 編輯: q10242 (114.24.181.235), 02/17/2015 15:37:45

02/17 20:23, , 2F
少講一個吧..i=0
02/17 20:23, 2F

02/20 17:35, , 3F
這篇滿好笑的 XD 其實這種作法叫做凱薩位移法
02/20 17:35, 3F

02/20 17:35, , 4F
考題應該要改成古羅馬時代才對 :P 不是說元po好笑啦...
02/20 17:35, 4F

02/20 17:37, , 5F
不過凱薩位移法跟維吉尼亞密碼應該是密碼學的基礎沒錯
02/20 17:37, 5F

02/20 17:38, , 6F
另外建議元po post code用這個 gist.github.com
02/20 17:38, 6F

02/20 19:34, , 7F
看到德軍編碼如此簡單, 月底上映的 Alan Turing 表示:
02/20 19:34, 7F

02/20 23:26, , 8F
其實德軍編碼用的enigma machine也是很適合當做中級
02/20 23:26, 8F

02/20 23:26, , 9F
密碼學的實做考題,以前我們學校考過這東西
02/20 23:26, 9F

02/20 23:30, , 10F
搞不好原po下次期末考就是考這個(誒) XD
02/20 23:30, 10F

02/22 19:00, , 11F
我們密碼學教恩尼格瑪幾乎矇混過去...
02/22 19:00, 11F
文章代碼(AID): #1KukRjw- (C_and_CPP)