[问题] 一个新手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