[問題] 一個新手printf問題

作者: q10242 (黑田祐司)   2015-02-17 14:59:53
開發平台(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):
我是新手
用範例的程式碼就沒問題 不曉得問題出在哪
作者: tsoahans (ㄎㄎ)   2015-02-17 15:24:00
你改到字串結束字元了 要改成i<strlen(code)
作者: justinj (黑旋風)   2015-02-17 20:23:00
少講一個吧..i=0
作者: Killercat (殺人貓™)   2015-02-20 17:35:00
這篇滿好笑的 XD 其實這種作法叫做凱薩位移法考題應該要改成古羅馬時代才對 :P 不是說元po好笑啦...不過凱薩位移法跟維吉尼亞密碼應該是密碼學的基礎沒錯另外建議元po post code用這個 gist.github.com
作者: uranusjr (←這人是超級笨蛋)   2015-02-20 19:34:00
看到德軍編碼如此簡單, 月底上映的 Alan Turing 表示:
作者: Killercat (殺人貓™)   2015-02-20 23:26:00
其實德軍編碼用的enigma machine也是很適合當做中級密碼學的實做考題,以前我們學校考過這東西搞不好原po下次期末考就是考這個(誒) XD
作者: kipi91718 (正港台灣人)   2015-02-22 19:00:00
我們密碼學教恩尼格瑪幾乎矇混過去...

Links booklink

Contact Us: admin [ a t ] ucptt.com